Commit 896274b1 by shenjunjie

词云图由hanLp调整为ansj

parent 555bf8de
......@@ -244,6 +244,12 @@
<artifactId>event-client</artifactId>
<version>${event-client.version}</version>
</dependency>
<!-- 分词jar -->
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
......
package com.zhiwei.brandkbs2.ansjSeg;
import com.zhiwei.brandkbs2.util.Tools;
import com.zhiwei.tools.order.TreatOrder;
import org.ansj.dic.LearnTool;
import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.library.UserDefineLibrary;
import org.ansj.recognition.impl.NatureRecognition;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class AnsjSeg
{
private static Logger logger = LogManager.getLogger(AnsjSeg.class);
private List<String> stopWords = MyDic.getStopWords(); // 停用词集合
private List<String> posivtiveWords = MyDic.getPosivtiveWords(); // 正面词集合
private List<String> negativeWords = MyDic.getNegativeWords(); // 负面词集合
private List<String> customWords = MyDic.getCustomWords(); // 自定义词集合
public void addAnsjSeg(List<String> newStopWords,
List<String> newCustomWords)
{
if (newStopWords != null)
{
this.stopWords.addAll(newStopWords);
}
if (newCustomWords != null)
{
this.customWords.addAll(newCustomWords);
}
}
/**
* @Title: getFenCi
* @Description: TODO(针对集合分词统计,并输出正负面词汇)
* @param dataList
* 设定文件
* @return HashMap<String,Object> 返回类型
*/
public Map<String, Object> getFenCi(List<String> dataList)
{
Map<String, Object> map = new HashMap<String, Object>(); // 分词总结果
Map<String, Integer> hash = new HashMap<String, Integer>(); // 初步分词结果
// 统计分词
for (String txt : dataList)
{
List<Term> termList = getFenci(txt);
if (termList != null)
{
for (Term term : termList)
{
String words = term.getName();
// 去除停用词和单词
if (words.length() > 1)
{
if (hash.containsKey(words))
{
hash.put(words, hash.get(words) + 1);
}
else
{
hash.put(words, 1);
}
}
}
}
}
// 统计正负面关键词
List<Map<String, Object>> goodResultList = new ArrayList<Map<String, Object>>(); // 正面关键词
List<Map<String, Object>> badResultList = new ArrayList<Map<String, Object>>(); // 负面关键词
// 对分词结果排序
List<Entry<String, Integer>> resultList = TreatOrder
.treatOrderByCountDesc(hash);
try
{
// 统计正负面关键词
for (Entry<String, Integer> entry : resultList)
{
String word = entry.getKey();
if (posivtiveWords.contains(word))
{
HashMap<String, Object> goodmap = new HashMap<String, Object>();
goodmap.put("key", entry.getKey());
goodmap.put("value", entry.getValue());
goodResultList.add(goodmap);
}
else if (negativeWords.contains(word))
{
HashMap<String, Object> badmap = new HashMap<String, Object>();
badmap.put("key", entry.getKey());
badmap.put("value", entry.getValue());
badResultList.add(badmap);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
// 输出正负面关键词
if (goodResultList.size() >= 10)
{
goodResultList = goodResultList.subList(0, 10);
}
if (badResultList.size() >= 10)
{
badResultList = badResultList.subList(0, 10);
}
if (resultList.size() >= 20)
{
resultList = resultList.subList(0, 20);
}
// 将总结果放入词云中
map.put("goodWord", goodResultList);
map.put("badWord", badResultList);
map.put("word", resultList);
return map;
}
/**
*
* @TODO (统计分词结果,按频次取前maxNum)
* @author 陈炜涛
* @param dataList
* @param maxNum
* @return
* @time 2016年11月16日上午11:06:10
* @return Map<String,Object>
*/
public List<Entry<String, Integer>> getFenCi(List<String> dataList, int maxNum)
{
Map<String, Object> map = new HashMap<>(); // 分词总结果
Map<String, Integer> hash = new HashMap<>(); // 初步分词结果
// 统计分词
for (String txt : dataList)
{
List<Term> termList = getFenci(txt);
if (termList != null)
{
for (Term term : termList)
{
String words = Tools.filterSpecialCharacter(term.getName());
String wordsPro = term.getNatureStr();
// 去除停用词和单词
if (words.length() > 1)
{
switch (wordsPro)
{
case "w":
break;
case "r":
break;
case "p":
break;
default:
if (hash.containsKey(words))
{
hash.put(words, hash.get(words) + 1);
}
else
{
hash.put(words, 1);
}
break;
}
}
}
}
}
Map<String, Integer> stopResults = new HashMap<>();
for (Entry<String, Integer> en : hash.entrySet())
{
if (!stopWords.contains(en.getKey()))
{
stopResults.put(en.getKey(), en.getValue());
}
}
// 对分词结果排序
List<Entry<String, Integer>> resultList = treatOrderByCountDesc(stopResults);
if (resultList.size() >= maxNum)
{
resultList = resultList.subList(0, maxNum);
}
return resultList;
}
/**
* @Title: getFenCi
* @Description: TODO(针对真文本分词并统计)
* @param name
* 设定文件
* @return HashMap<String,Integer> 返回类型
*/
public HashMap<String, Integer> getFenCi(String name)
{
HashMap<String, Integer> hash = new HashMap<String, Integer>(); // 初步分词结果
List<Term> termList = getFenci(name);
if (termList != null)
{
for (Term term : termList)
{
String word = term.getName();
if (hash.containsKey(word))
{
hash.put(word, hash.get(word) + 1);
}
else
{
hash.put(word, 1);
}
}
}
return hash;
}
/**
* @Title: removeStopWord
* @Description: TODO(分词)
* @ 设定文件
* @return void 返回类型
*/
public List<Term> getFenci(String text)
{
try
{
// 去重停用词(看源码应该是删除分词关键词)
// for (String word : stopWords)
// {
// UserDefineLibrary.removeWord(word);
// }
// 添加自定义词
for (String word : customWords)
{
UserDefineLibrary.insertWord(word);
}
// 分词
LearnTool learnTool = new LearnTool();
NlpAnalysis nlp = new NlpAnalysis().setLearnTool(learnTool); //
Result result = nlp.parseStr(text);
new NatureRecognition().recognition(result);
return result.getTerms();
}
catch (Exception e)
{
logger.error("分词出现问题");
return null;
}
}
/**
*
* @Title: treatOrderByCountDesc
* @Description: TODO(根据数量降序)
* @param dataMap
* 设定文件
* @return List<Entry<String,Integer>> 返回类型
*/
public static List<Entry<String, Integer>> treatOrderByCountDesc(
Map<String, Integer> dataMap)
{
List<Entry<String, Integer>> list = new ArrayList<>(dataMap.entrySet());
list.sort((o1, o2) -> getCompareResult(o1.getValue(), o2.getValue(), false));
return list;
}
/**
* @Title: getCompareResult
* @Description: TODO(排序比较)
* @param time1
* @param time2
* @param asc
* 设定文件
* @return int 返回类型
*/
private static int getCompareResult(long time1, long time2, boolean asc)
{
long result;
if (asc)
{
result = time1 - time2;
}
else
{
result = time2 - time1;
}
if (result > 0)
{
result = 1;
}
else if (result < 0)
{
result = -1;
}
return (int) result;
}
}
\ No newline at end of file
package com.zhiwei.brandkbs2.ansjSeg;
import com.zhiwei.brandkbs2.util.Tools;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* @author 落花流水
* @Description: 用于自定义词库
* @ClassName: MyDic
* @date 2016年3月28日 上午11:36:01
*/
@Component
public class MyDic {
public final static Logger log = LogManager.getLogger(MyDic.class);
@Value("classpath:ansjWordDic/customDic.txt")
private Resource customDic;
@Value("classpath:ansjWordDic/stopWordsDic.txt")
private Resource stopDic;
@Value("classpath:ansjWordDic/negativeDic.txt")
private Resource negativeDic;
@Value("classpath:ansjWordDic/positiveDic.txt")
private Resource positiveDic;
private static List<String> customWords;
private static List<String> stopWords;
private static List<String> negativeWords;
private static List<String> positiveWords;
@PostConstruct
public void init() {
try {
// 读取词典
List<String> customDics = Tools.readListFile(customDic.getInputStream());
List<String> stopDics = Tools.readListFile(stopDic.getInputStream());
InputStream inputStream = negativeDic.getInputStream();
List<String> negativeDic = Tools.readListFile(inputStream);
InputStream inputStream2 = positiveDic.getInputStream();
List<String> positiveDic = Tools.readListFile(inputStream2);
log.info("ansj自定义词典加载:{}条,停用词加载:{}条,负面词典加载:{}条,正面词典加载:{}条", customDics.size(), stopDics.size(), negativeDic.size(), positiveDic.size());
} catch (Exception e) {
log.info("MyDic-init 异常", e);
}
}
/**
* @return List<String> 返回类型
* @Title: getCustomWords
* @Description: TODO(获取用户自定义词)
* 设定文件
*/
public static List<String> getCustomWords() {
return customWords;
}
/**
* @return List<String> 返回类型
* @Title: getCustomWords
* @Description: TODO(获取负面词)
* 设定文件
*/
public static List<String> getNegativeWords() {
return negativeWords;
}
/**
* @return List<String> 返回类型
* @Title: getCustomWords
* @Description: TODO(获取正面词)
* 设定文件
*/
public static List<String> getPosivtiveWords() {
return negativeWords;
}
/**
* @return List<String> 返回类型
* @Title: getCustomWords
* @Description: TODO(获取停用词)
* 设定文件
*/
public static List<String> getStopWords() {
return stopWords;
}
/**
* @param words 设定文件
* @return boolean 返回类型
* @Title: addCustomWords
* @Description: TODO(向词库中添加自定义词)
*/
public static boolean addCustomWords(List<String> words) {
return addWords(customWords, words);
}
/**
* @param words 设定文件
* @return boolean 返回类型
* @Title: addCustomWords
* @Description: TODO(向词库中添加负面词)
*/
public static boolean addNegativeWords(List<String> words) {
return addWords(negativeWords, words);
}
/**
* @param words 设定文件
* @return boolean 返回类型
* @Title: addCustomWords
* @Description: TODO(向词库中添加正面词)
*/
public static boolean addPositiveWords(List<String> words) {
return addWords(positiveWords, words);
}
/**
* @param words 设定文件
* @return boolean 返回类型
* @Title: addCustomWords
* @Description: TODO(向词库中添加停用词)
*/
public static boolean addStopWords(List<String> words) {
return addWords(stopWords, words);
}
private static boolean addWords(List<String> targetList, List<String> addList) {
if (null == addList) {
return false;
}
for (String word : addList) {
if (!targetList.contains(word)) {
targetList.add(word);
}
}
return true;
}
/**
* @param file
* @param newWordList
* @param @throws IOException 设定文件
* @return BufferedWriter 返回类型
* @Title: writerWords
* @Description: 把新的关键词存入文件
*/
private static boolean writerWords(File file, List<String> newWordList) {
boolean flag = false;
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), StandardCharsets.UTF_8));
for (String word : newWordList) {
writer.newLine();
writer.write(word);
}
flag = true;
} catch (Exception e) {
log.error("写入数据出错:{}", e.getMessage());
} finally {
try {
if (null != writer) {
writer.close();
}
} catch (IOException e) {
log.error("关闭输出流出错:{}", e.getMessage());
}
}
return flag;
}
}
......@@ -979,7 +979,15 @@ public class ChannelServiceImpl implements ChannelService {
BoolQueryBuilder postFilter = getChannelListQuery(projectId, contendId, keyword, platforms, emotions,
mediaTypes, articlesCount);
searchHelper.setPostFilter(postFilter);
searchHelper.setSort(SortBuilders.fieldSort("influence").order(SortOrder.DESC));
if (null != sorter) {
for (Map.Entry<String, Object> entry : JSONObject.parseObject(sorter).entrySet()) {
if (entry.getValue().toString().contains("desc")) {
searchHelper.setSort(SortBuilders.fieldSort(entry.getKey()).order(SortOrder.DESC));
} else {
searchHelper.setSort(SortBuilders.fieldSort(entry.getKey()).order(SortOrder.ASC));
}
}
}
searchHelper.setFrom((page - 1) * pageSize);
searchHelper.setSize(pageSize);
searchHelper.setIndexes(new String[] { ChannelEsDao.CHANNEL_COPY_ES_INDEX_NAME });
......
......@@ -7,6 +7,7 @@ import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.CustomDictionary;
import com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary;
import com.hankcs.hanlp.seg.common.Term;
import com.zhiwei.brandkbs2.ansjSeg.AnsjSeg;
import com.zhiwei.brandkbs2.common.GenericAttribute;
import com.zhiwei.nlp.AggreeBootStarter;
import com.zhiwei.nlp.common.AggreeConfig;
......@@ -38,6 +39,7 @@ public class TextUtil {
private Resource customDic;
@Value("classpath:wordDic/stopWordDictionary.txt")
private Resource stopDic;
private static AnsjSeg ansjSeg;
@PostConstruct
public void init() {
......@@ -104,9 +106,10 @@ public class TextUtil {
}
public static List<JSONObject> getHighWordsJson(List<String> texts, Integer maxSize) {
Map<String, Integer> highWords = getHighWords(texts, maxSize);
List<JSONObject> result = new ArrayList<>(highWords.size());
for (Map.Entry<String, Integer> entry : highWords.entrySet()) {
// Map<String, Integer> highWords = getHighWords(texts, maxSize);
List<Map.Entry<String, Integer>> wordRate = ansjSeg.getFenCi(texts, maxSize);
List<JSONObject> result = new ArrayList<>(wordRate.size());
for (Map.Entry<String, Integer> entry : wordRate) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", entry.getKey());
jsonObject.put("num", entry.getValue());
......
......@@ -536,10 +536,12 @@ public class Tools {
//根据文件路径创建缓冲输入流
br = new BufferedReader(new InputStreamReader(inputStream));
//循环读取文件的每一行,对需要修改的行进行修改,放入缓冲对象中
while (StringUtils.isNotEmpty(line = StringUtils.trim(br.readLine()))) {
while (null != (line = StringUtils.trim(br.readLine()))) {
// 去除多余空格
if (StringUtils.isNotEmpty(line)) {
result.add(line);
}
}
} catch (Exception e) {
throw new Exception(e);
} finally {
......
蓝瘦香菇
\ No newline at end of file
昨天
明天
今天
微博
转发
现在
嘿嘿
还要
赶早不赶晚
这些
日益
倒不如
立地
不只
一般
豁然
将近
毫不
大张旗鼓
不可开交
"
#
!
&
全力
就算
'
$
%
...
*
+
(
她们
)
.
/
各位
,
-
︿
3
2
1
不止
基本
0
不拘
7
这里
6
5
4
;
:
如此
9
8
极度
?
>
首先
=
<
也罢
@
A
当庭
隔夜
不少
不胜
\
_
^
到目前为止
大大
除开
暗中
而外
开始
`
三番两次
宁可
这么
权时
结果
大多
除此以外
单单
如下
几度
何处
如上
~
吧哒
|
放量
即便
当年
不对
顷刻
本人
岂非
趁热
哪边
立马
乘势
何况
这个
人民
率尔
那种
仍然
不能
根据
并肩
相对而言
也好
什么样
累年
扑通
即使
开外
大概
依照
·
乃至
与否
总而言之
高低
切切
多次
比如说
不亦乐乎
如期
简言之
何妨
不管怎样
将才
呆呆地
略为
更为
大约
其次
倍加
不定
除了
之后
难道
不可
风雨无阻
陡然
为了
及至
对于
虽说
彻夜
嘎嘎
不同
大体上
来得及
人人
比方
简而言之
这么些
不至于
这部
谁知
几时
应当
人家
如今
尽量
总的说来
继之
单纯
方才
这么点儿
乘胜
八成
光是
倘或
忽然
从头
出去
切不可
哪年
竟然
是否
而况
加以
从此以后
省得
我们
不力
各个
充其极
次第
岂止
尽管如此
偶而
看上去
截然
甚而
如常
任何
极端
接着
嘎登
皆可
具体地说
凝神
这就是说
千万
好在
从早到晚
各自
取道
纯粹
这种
只限
上去
恐怕
莫非
虽然
碰巧
紧接着
即若
等等
按照
不单
具体说来
一旦
不要
怎样
轰然
每当
接连不断
不比
各种
理应
连袂
什么
那里
后来
日渐
暗自
以免
不然
别人
看来
沙沙
趁势
切莫
从重
尽心尽力
切勿
果真
要不是
并排
自己
保管
差一点
默然
此中
藉以
不惟
的确
此后
待到
末##末
哪些
不然的话
其他
毫无
连声
趁早
几经
挨门挨户
挨次
保险
从小
莫若
刚好
如若
默默地
是的
嗡嗡
请勿
得起
借此
从此
然而
亲眼
略微
刚才
一定
反倒是
按时
倘若
差不多
从无到有
起来
反之则
何止
惯常
姑且
与其
哪个
反而
常言道
大抵
不再
到了儿
再者
并且
趁着
两者
等到
不经意
如何
来着
不由得
怎么样
尽管
知道
旁人
不管
个人
哪里
似的
倒不如说
其余
长此下去
匆匆
多少
当着
就是说
既然
虽则
纵使
呼哧
沿
联袂
或许
来看
俺们
倘然
只是
大凡
而言
当真
因此
不如
据此
更进一步
那么样
纵然
不仅...而且
极为
尽然
长期以来
不妨
不止一次
——
较比
必须
或是
向着
从古到今
尽如人意
毕竟
川流不息
确实
可以
并没有
当场
要不
那儿
纵令
恰巧
无宁
来讲
局外
近年来
起首
,
赶快
需要
即令
大略
将要
不特
然则
极了
但是
不独
何苦
一则
猛然
屡屡
到底
在下
设使
经过
至于
老老实实
猛然间
截至
譬如
很多
一切
别的
要么
趁机
越是
 
按期
何尝
动不动
不外
因为
使得
如果
按说
不大
自从
以便
宁肯
当下
不光
它们
之类
老大
尽可能
尔后
成年累月
如上所述
每个
彼此
从宽
就此
达旦
当口儿
归根结底
看起来
或多或少
当中
据我所知
据实
不免
遵照
固然
缕缕
换言之
策略地
居然
连日来
起见
比照
不成
不仅仅是
长话短说
因而
设若
不论
沿着
恍然
慢说
亲身
哼唷
便
以至
以致
本着
论说
除外
之所以
简直
前后
大家
果然
共总
时候
不怎么
如次
鄙人
亲手
顿时
顺着
叮当
敞开儿
大面儿上
年复一年
打开天窗说亮话
上来
假若
不曾
着呢
快要
此刻
而且
背靠背
假使
陈年
多多益善
另方面
他人
到处
大体
下来
云云
全然
何须
为着
每逢
很少
尚且
只要
不仅仅
顷刻间
常常
日臻
恰似
得天独厚
另外
敢情
率然
并无
届时
每每
成为
他们
尔等
尽快
不消
如其
反之亦然
当即
据悉
前者
必定
[
处处
]
断然
绝非
总的来看
岂但
分期
古来
我们
啪达
顷刻之间
每次
别说
传闻
从优
总的来说
非徒
常言说得好
非得
由于
难说
可是
从今以后
比如
继而
不可抗拒
精光
凭借
略加
平素
绝对
于是
一样
长线
每时每刻
不择手段
理该
拦腰
喔唷
仍旧
屡次
以及
当然
到头来
抑或
宁愿
一方面
举凡
只有
咱们
从新
这样
不得已
十分
自个儿
呼啦
必将
串行
而论
牢牢
成心
哈哈
与此同时
其一
于是乎
看样子
换句话说
全身心
除非
有人
以至于
按理
也许
打从
照着
况且
除却
不了
不得
反手
成年
哎呀
关于
恰恰相反
这儿
累次
其中
动辄
立刻
倒是
毫无例外
从古至今
可见
诚然
莫不
怎么办
亲自
经常
决不
自各儿
这么样
不必
不得了
除去
由此可见
有些
挨个
不仅
进来
大事
全年
绝顶
社会主义
总之
当头
若是
不外乎
要不然
如此等等
分期分批
那么
毋宁
其二
不会
..
背地里
此间
哪儿
不怕
不问
为什么
没有
公然
那会儿
迫于
来不及
不起
千万千万
可能
正如
还有
究竟
及其
不限
偏偏
据称
故此
伙同
敢于
弹指之间
那些
朝着
叮咚
临到
即将
哎哟
而已
尽心竭力
到头
亲口
已经
不但
出来
随着
不得不
非常
另一个
非但
如前所述
--
诸位
那时
即是说
何时
此外
然后
勃然
从来
近几年来
近来
莫如
奋勇
比起
仅仅
故而
穷年累月
乌乎
怪不得
借以
主要
间或
方能
白白
反过来
全都
并没
除此之外
马上
恰恰
传说
从速
上下
哪样
这边
从未
不能不
从不
那个
迟早
不知不觉
挨家挨户
多多少少
几番
有关
连同
互相
怎么
但愿
你们
凑巧
连日
路经
起先
二话没说
之一
这时
即或
连连
其后
各式
当儿
独自
哪天
就是
乘机
常言说
不下
昂然
毫无保留地
趁便
屡次三番
甚至
那末
充其量
该当
另一方面
既...又
瑟瑟
的话
呜呼
或者
立时
反过来说
有的
挨着
再说
够瞧的
过于
就地
极其
何乐而不为
进去
起头
无论
据说
综上所述
抽冷子
才能
极大
恰逢
大举
漫说
接下来
忽地
而是
难得
不但...而且
格外
倘使
还是
从而
本身
乘隙
既是
理当
反倒
可好
不满
交口
基本上
认为
这会儿
充分
并非
不迭
老是
倍感
鉴于
要是
反之
哪怕
除此而外
一下
自身
任凭
几乎
顶多
而又
不时
一个
否则
自家
三天两头
啊呀
难怪
所以
发生
哗啦
多年来
罢了
大致
从轻
那边
那么些
不巧
完全
起初
某个
加之
大不了
归根到底
偶尔
应该
二话不说
日见
不是
大都
愤然
而后
多年前
例如
一些
多多
日复一日
较之
即刻
那样
其它
不料
决非
乘虚
恰如
能够
从严
故意
啊哟
从中
不已
加上
具体来说
较为
分头
直到
>>
隔日
多亏
假如
甚么
作为
暗地里
挨门逐户
恰好
其实
何必
万一
不过
某些
啊哈
基于
不日
尽早
刚巧
一来
同时
三番五次
为何
更加
绝不
除此
不常
进而
另行
急匆匆
通过
话说
若非
极力
存心
http
https
cn
com
呵呵
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment