因需求,现需分词接口,故记录之。

1、需要依赖:

 <!-- https://mvnrepository.com/artifact/com.janeluo/ikanalyzer -->
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>

maven依赖

2、完整代码如下:

 public JSONArray entropy(String content, Integer quantity) throws Exception {
List<String> words = extract(DelHtmlTagUtil.delHTMLTag(content), quantity);
JSONArray array = calculateWordEntropy(words);
return array;
} /**
* 传入String类型的文章,智能提取单词放入list
*
* @param content 传入分词的内容
* @param quantity 截取关键字在几个单词以上的数量,默认为1
* @return
*/
private List<String> extract(String content, Integer quantity) throws IOException {
List<String> list = Lists.newArrayList();
StringReader reader = new StringReader(content);
IKSegmenter ik = new IKSegmenter(reader, true);
Lexeme lex = null;
while ((lex = ik.next()) != null) {
//String typeString = lex.getLexemeTypeString(); 词语类型
String word = lex.getLexemeText();
if (word.length() > quantity) {//判断截取关键字在几个单词以上的数量
list.add(word);
}
}
return list;
} private JSONArray calculateWordEntropy(List<String> words) throws Exception{ int length = words.size();
ArrayList<String[]> wordList = new ArrayList<String[]>();
// 将分好的词每3个一组存到数组中
for (int i = 0; i < length; i++) { String[] wordSeg = new String[3];
if (i == 0) {
wordSeg[0] = "null";
wordSeg[1] = words.get(i);
wordSeg[2] = words.get(i + 1);
} else if (i == length - 1) {
wordSeg[0] = words.get(i - 1);
wordSeg[1] = words.get(i);
wordSeg[2] = "null";
} else {
wordSeg[0] = words.get(i - 1);
wordSeg[1] = words.get(i);
wordSeg[2] = words.get(i + 1);
} wordList.add(wordSeg); }
// 去除重复的词
List<String> lists = Lists.newArrayList();
for (int l = 0; l < length; l++) {
lists.add(words.get(l));
}
List<String> tempList = Lists.newArrayList();
for (String str : lists) {
if (!(tempList.contains(str))) {
tempList.add(str);
}
}
String[] wordClean = new String[tempList.size()];
for (int m = 0; m < tempList.size(); m++) {
wordClean[m] = tempList.get(m);
}
// 统计每个词的词频
int[] frequent = new int[wordClean.length];
for (int j = 0; j < wordClean.length; j++) {
int count = 0;
for (int k = 0; k < words.size(); k++) {
if (wordClean[j].equals(words.get(k))) {
count++;
}
}
frequent[j] = count;
}
// 将三元组中中间的那个词相同的存到一个list中,然后计算该词的信息熵
double[] allEntropy = new double[wordClean.length];
for (int n = 0; n < wordClean.length; n++) {
ArrayList<String[]> wordSegList = new ArrayList<String[]>();
int count = 1;
for (int p = 0; p < wordList.size(); p++) {
String[] wordSegStr = wordList.get(p);
if (wordSegStr[1].equals(wordClean[n])) {
count++;
wordSegList.add(wordSegStr);
}
}
String[] leftword = new String[wordSegList.size()];
String[] rightword = new String[wordSegList.size()];
// 计算左信息熵
for (int i = 0; i < wordSegList.size(); i++) {
String[] left = wordSegList.get(i);
leftword[i] = left[0];
}
// 去除左边重复的词
List<String> listsLeft = new ArrayList<String>();
for (int l = 0; l < leftword.length; l++) {
listsLeft.add(leftword[l]);
}
List<String> tempListLeft = new ArrayList<String>();
for (String str : listsLeft) {
if (!(tempListLeft.contains(str))) {
tempListLeft.add(str);
}
}
String[] leftWordClean = new String[tempListLeft.size()];
for (int m = 0; m < tempListLeft.size(); m++) {
leftWordClean[m] = tempListLeft.get(m);
}
// 统计左边每个词的词频
int[] leftFrequent = new int[leftWordClean.length];
for (int j = 0; j < leftWordClean.length; j++) {
int leftcount = 0;
for (int k = 0; k < leftword.length; k++) {
if (leftWordClean[j].equals(leftword[k])) {
leftcount++;
}
}
leftFrequent[j] = leftcount;
}
// 计算左熵值
double leftEntropy = 0;
for (int i = 0; i < leftFrequent.length; i++) {
double a = (double) leftFrequent[i] / count;
double b = Math.log((double) leftFrequent[i] / count);
leftEntropy += -a * b;
// leftEntropy +=
// (-(double)(leftFrequent[i]/count))*Math.log((double)(leftFrequent[i]/count));
}
// 计算右信息熵
for (int i = 0; i < wordSegList.size(); i++) {
String[] right = wordSegList.get(i);
rightword[i] = right[2];
}
// 去除右边重复的词
List<String> listsRight = new ArrayList<String>();
for (int l = 0; l < rightword.length; l++) {
listsRight.add(rightword[l]);
}
List<String> tempListRight = new ArrayList<String>();
for (String str : listsRight) {
if (!(tempListRight.contains(str))) {
tempListRight.add(str);
}
}
String[] rightWordClean = new String[tempListRight.size()];
for (int m = 0; m < tempListRight.size(); m++) {
rightWordClean[m] = tempListRight.get(m);
}
// 统计右边每个词的词频
int[] rightFrequent = new int[rightWordClean.length];
for (int j = 0; j < rightWordClean.length; j++) {
int rightcount = 0;
for (int k = 0; k < rightword.length; k++) {
if (rightWordClean[j].equals(rightword[k])) {
rightcount++;
}
}
rightFrequent[j] = rightcount;
}
// 计算右熵值
double rightEntropy = 0.0;
for (int i = 0; i < rightFrequent.length; i++) {
double a = (double) rightFrequent[i] / count;
double b = Math.log((double) rightFrequent[i] / count);
rightEntropy += -a * b;
// rightEntropy +=
// (-(double)(rightFrequent[i]/count))*Math.log((double)(rightFrequent[i]/count));
}
// 计算词的总信息熵
double wordEntropy = leftEntropy + rightEntropy;
allEntropy[n] = wordEntropy; }
JSONArray list = new JSONArray();
for (int i = 0; i < allEntropy.length; i++) {
JSONObject obj = new JSONObject();
obj.put("name", wordClean[i]);
obj.put("entropy", allEntropy[i]);
list.add(obj);
}
Collections.sort(list, (o1, o2) -> {
Double d1 = ((JSONObject) o1).getDouble("entropy");
Double d2 = ((JSONObject) o2).getDouble("entropy");
return d2.compareTo(d1);
}); return list;
}

处理代理

ikanalyzer分词,计算信息熵排序分词结果的更多相关文章

  1. python 分词计算文档TF-IDF值并排序

    文章来自于我的个人博客:python 分词计算文档TF-IDF值并排序 该程序实现的功能是:首先读取一些文档,然后通过jieba来分词,将分词存入文件,然后通过sklearn计算每一个分词文档中的tf ...

  2. IKAnalyzer结合Lucene实现中文分词

    1.基本介绍 随着分词在信息检索领域应用的越来越广泛,分词这门技术对大家并不陌生.对于英文分词处理相对简单,经过拆分单词.排斥停止词.提取词干的过程基本就能实现英文分词,单对于中文分词而言,由于语义的 ...

  3. php 分词 —— PHPAnalysis无组件分词系统

    分词,顾名思义就是把词语分开,从哪里分开?当然是一大堆词语里了,一大堆词语是什么?是废话或者名言.这在数据库搜索时非常有用. 官方网站 http://www.phpbone.com/phpanalys ...

  4. 自然语言处理之中文分词器-jieba分词器详解及python实战

    (转https://blog.csdn.net/gzmfxy/article/details/78994396) 中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块,在进行中文自 ...

  5. 利用IK分词器,自定义分词规则

    IK分词源码下载地址:https://code.google.com/p/ik-analyzer/downloads/list lucene源码下载地址:http://www.eu.apache.or ...

  6. Python 结巴分词(1)分词

    利用结巴分词来进行词频的统计,并输出到文件中. 结巴分词github地址:结巴分词 结巴分词的特点: 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成 ...

  7. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器

    首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...

  8. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  9. 盘古分词demo,盘古分词怎么用

    1.下载PanGu.dll dll地址:http://download.csdn.net/detail/dhfekl/7493687 2.将PanGu.dll和词库引入到项目 最新词库地址:http: ...

随机推荐

  1. IIS日志存入数据库之二:ETW

    在上一篇文章<IIS日志存入数据库之一:ODBC>中,我提到了ODBC方式保存的缺点,即:无法保存响应时间以及接收和响应的字节数. 如果一定要获取响应时间以及接收和响应的字节数的话,就要另 ...

  2. asp.net core mvc 中间件之路由

    asp.net core mvc 中间件之路由 路由中间件 首先看路由中间件的源码 先用httpContext实例化一个路由上下文,然后把中间件接收到的路由添加到路由上下文的路由集合 然后把路由上下文 ...

  3. Linux 安装JavaEE环境之jdk安装笔记

    1.安装jdk 先用xftp将jdk的压缩包上传到 /opt/ 2.在/usr/local/下使用命令mkdir java创建java目录 将jdk-7u79-linux-x64.gz解压缩至/usr ...

  4. SAP接口的调用

    最近做一个专案用到的SAO接口的调用,用到的上传参数获取回传的IRfcTable,以及以IRfcTable作为参数上传SAP,通过查阅很多资料,发现资料说明的也多是鱼龙混杂,许多没有实现就直接贴在上面 ...

  5. js基于json的级联下拉框

    级联下拉列表是项目中常用到的.比如省市县,比如企业性质等,做成一个js通用组件, 在静态页出来后可以直接插入,将数据和html静态页做一个解耦. 贴出来抛砖引玉吧. /** * @author sun ...

  6. Swift 里 Array (一)内存结构

    public struct Array<Element>: _DestructorSafeContainer { #if _runtime(_ObjC) @usableFromInline ...

  7. Sublime Text3 实现在浏览器中以HTML格式预览md文件

    1.首先找到Package Control 打开Sublime Text3,找到菜单栏:Preferences → Package Control,没有找到Package Control,那么点击Pa ...

  8. git status的用法

    git status 用于查看工作区与暂存区的已tracked及untracked的所有文件status. 以下为help结果. git help status NAME git-status - S ...

  9. pcm原始数据绘制

    最近帮别人做了个东西,这里分享一下pcm原始数据绘图的思路 1.pcm数据采样位数,根据采样位数选取适合自己绘图的采样点的数量 2.计算出最大最小的的采样点的值差 3.根据要显示pcm数据的控件宽高, ...

  10. MyBatis中如何一次执行多条语句(使用mysql数据库)

    解决办法不外乎有三个:1.多条sql分批执行:2.存储过程或函数调用:3.sql批量执行. MyBatis中如何一次执行多条语句(使用mysql数据库): 1.修改数据库连接参数加上allowMult ...