高亮标红

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class Highlighter {
    public static void main(String[] args) throws IOException {
        String content = "挖掘频繁项集的方法可以扩展到挖掘闭频繁项集(由它们容易导出频繁项集的集合)。这些方法结合了附加的优化技术,如项合并、子项剪枝和项跳过,以及模式树中产生的项集的有效子集检查。"
                + "挖掘频繁项集和关联已经用不同的方法扩展,包括挖掘多层关联规则和多维关联规则。多层关联规则可以根据每个抽象层的最小支持度阈值如何定义,使用多种策略挖掘。如一致的支持度、递减的支持度和基于分组的支持度。"
                + "冗余的多层(后代)关联规则可以删除,如果根据其对应的祖先规则,他们的支持度和置信度接近于期望值的话。挖掘多维关联规则的技术可以根据对量化属性的处理分为若干类。第一,量化属性可以根据预定义的概念分层静态离散化。"
                + "数据立方体非常适合这种方法,因为数据立方体和量化属性都可以利用概念分层。第二,可以挖掘量化关联规则,其中量化属性根据分箱和/或聚类动态离散化,“邻近的”关联规则可以用聚类合并,产生更简洁、更有意义的规则。"
                + "基于约束的规则挖掘允许用户通过提供元规则(即模式模板)和其他挖掘约束对规则搜索聚焦。这种挖掘推动了说明性数据挖掘查询语言和用户界面的使用,并对挖掘查询优化提出了巨大挑战。"
                + "规则约束可以分为五类:反单调的、单调的、简洁的、可转变的和不可转变的。前四类约束可以在频繁项集挖掘中使用,使挖掘更有功效,更有效率。没有进一步分析或领域知识,关联规则不应该直接用于预测。"
                + "它们不必指示因果关系。然而,对于进一步探查,它们是有帮助的切入点,使得它们成为理解数据的流行工具。流数据不断地在计算机系统中流进流出并且具有变化的更新速度,涉及数据流的应用非常广泛。"
                + "大纲提供数据流的汇总,通常用来返回查询的近似解答。随机抽样、滑动窗口、直方图、多分辨率方法、梗概以及随机算法都是大纲的形式。倾斜时间框架模型允许数据以多个时间粒度存储,最近的时间记录在最细的粒度上,"
                + "最远的时间记录在最粗的粒度上。流立方体可以存储压缩的数据,对时间维度使用倾斜时间框架模型,并且仅在一些关键的层上存储数据,关键层反映了分析人员最感兴趣的数据层,从而基于到关键层的“常用路径”进行部分物化。";

        String query = "数据挖掘";
        long start = System.currentTimeMillis();
        
        String s = new Highlighter(query).getBestFragment(content);
        
        System.out.println("Generate HTML: ");
        File f = new File("demo.html");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
        osw.write("<pre><b>" + content + "</pre><br/><br/>" + "<pre><b>" + s + "</pre><br/><br/>");
        osw.close();

        System.out.println("Hightlighter -> " + s);
        System.out.println("cost: " + (System.currentTimeMillis() - start));
    }

    private static String BEGIN = "<font color=\"red\">";
    private static String END = "</font>";

    private Set<Character> set = new HashSet<Character>();

    public Highlighter(String query) {
        char[] chars = null;
        chars = query.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            set.add(chars[i]);
        }
    }

    public String getBestFragment(String content) {
        String[] strs = content.replace(".", "。").split("。");
        char[] chars = null;

        TreeSet<Sentence> ts = new TreeSet<Sentence>(new Comparator<Sentence>() {
            public int compare(Sentence o1, Sentence o2) {
                if (o1.getIndex() < o2.getIndex()) {
                    return -1;
                } else if (o1.getIndex() > o2.getIndex()) {
                    return 1;
                } else
                    return 0;
            }
        });
        Sentence sentence = null;
        int score = 0;
        StringBuilder sb = null;
        System.out.println("total sentences: " + strs.length);
        for (int i = 0; i < strs.length; i++) {
            sentence = new Sentence();
            sb = new StringBuilder();
            sentence.setIndex(i);
            sentence.setText(strs[i]);
            chars = strs[i].toCharArray();
            for (int j = 0; j < chars.length; j++) {
                if (set.contains(chars[j])) {
                    score++;
                    sb.append(BEGIN);
                    sb.append(chars[j]);
                    sb.append(END);
                } else {
                    sb.append(chars[j]);
                }
            }
            sentence.setValue(sb.toString());
            sentence.setScore(score);
            ts.add(sentence);
            score = 0;
            sb = new StringBuilder();
        }

        Iterator<Sentence> it = ts.iterator();
        Sentence tmp = null;
        int number = 0;
        sb = new StringBuilder();
        for (; it.hasNext();) {
            tmp = it.next();
            sb.append(tmp.getValue());
            sb.append("。");
            System.out.println(tmp);
            number++;
        }

        System.out.println("After : " + number);
        return sb.toString();
    }

    class Sentence {
        String value;
        int index;
        int score;
        String text;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }

        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }

        public int getScore() {
            return score;
        }

        public void setScore(int score) {
            this.score = score;
        }

        public String toString() {
            return this.index + " " + this.score + "  " + this.value;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据挖掘DT机器学习

从互联网巨头数据挖掘类招聘笔试题目看我们还差多少

1 从阿里数据分析师笔试看职业要求 以下试题是来自阿里巴巴招募实习生的一次笔试题,从笔试题的几个要求我们一起来看看数据分析的职业要求。 一、异常值是指什么?请列...

39970
来自专栏章鱼的慢慢技术路

《算法图解》第一章笔记与课后练习_二分查找算法

22940
来自专栏技术翻译

Python中的NLP

自然语言处理(NLP)是数据科学中最有趣的子领域之一,数据科学家越来越期望能够制定涉及利用非结构化文本数据的解决方案。尽管如此,许多应用数据科学家(来自STEM...

42950
来自专栏程序员叨叨叨

7.2 uniform

Cg 语言将输入数据流分为两类(参见文献[3]Program inputs and Outputs ):

8640
来自专栏mathor

LeetCode69. x 的平方根

 这道题直接一个return Math.sqrt就出来了,但是秉承着学习的心态,尝试着用二分法ac  首先要确定的就是左右区间,左区间是0无疑了,那么右...

22020
来自专栏大数据文摘

Python入门之数据处理——12种有用的Pandas技巧

23850
来自专栏祝威廉

从DataFrame自动化特征抽取的尝试

虽然提供了很多Estimator/Transformer, 正如这篇文章所显示的,如何基于SDL+TensorFlow/SK-Learn开发NLP程序,处理的代...

9230
来自专栏数据结构与算法

2018.10.23NOIP模拟赛解题报告

比赛开场看T1一点思路都没有,不管怎么想都是\(O(n^2)\)的复杂度,做了好久终于发现自己傻逼了这就是个傻逼题。。

10930
来自专栏小樱的经验随笔

鸽巢原理(抽屉原理)的详解

抽屉原理 百科名片 ? 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果。这一现象就是我们所说的“抽屉原理”...

54670
来自专栏机器学习和数学

[数据结构和算法]《算法导论》动态规划笔记(1)

动态规划是求解最优化问题的方法,这类问题有很多可行解,每个解都有一个值,我们希望寻找具有最优值的解。我们称这个解为问题的一个最优解,而不是最优解,因为可能有多个...

407100

扫码关注云+社区

领取腾讯云代金券