├── .Rhistory
├── .gitignore
├── README.md
├── ik_dic
├── ext_ik.dic
└── stopwords_ik.dic
├── pom.xml
├── python
└── NegativeSentiment.py
└── src
├── main
├── assembly
│ └── distribution.xml
├── bin
│ └── ctl.sh
├── java
│ └── zx
│ │ └── soft
│ │ └── negative
│ │ └── sentiment
│ │ ├── analyzer
│ │ └── AnalyzerTool.java
│ │ ├── core
│ │ ├── AdvertisementClassify.java
│ │ ├── ClassifySentiment.java
│ │ └── NegativeClassify.java
│ │ ├── demo
│ │ ├── AdvertisementClassifyDemo.java
│ │ └── NegativeClassifyDemo.java
│ │ ├── domain
│ │ ├── EmotionDictionary.java
│ │ └── TextScorePost.java
│ │ ├── driver
│ │ └── NegativeSentimentDriver.java
│ │ └── web
│ │ ├── TextScoreApplication.java
│ │ ├── TextScoreResource.java
│ │ └── TextScoreServer.java
└── resources
│ ├── emotion_dict
│ ├── advertisement-words-20140827
│ ├── insufficiently
│ ├── inverse
│ ├── ish
│ ├── more
│ ├── most
│ ├── negative-words-20140810
│ ├── over
│ └── very
│ ├── logback.xml
│ └── web-server.properties
└── test
├── java
└── zx
│ └── soft
│ └── negative
│ └── sentiment
│ └── core
│ └── NegativeClassifyTest.java
└── resources
├── adv-data
├── logback-test.xml
└── neg-data
/.Rhistory:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ml-distribution/negative-sentiment/e1a8cbba642e32e4f6211109f387faf4f1819f22/.Rhistory
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .classpath
2 | .project
3 | .settings/
4 | target/
5 | logs/
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | ### 基于词典的负面舆情信息评分算法。
3 |
4 | > 基于Java实现。
5 |
6 | #### 项目内容
7 |
8 |
9 | 针对社交网络数、博客、新闻、论坛等数据进行负面信息提取,并给出评分,主要用于网络信息监控领域。
10 |
11 |
12 | #### 使用示例
13 |
14 | ```java
15 | NegativeSentiment negativeSentiment = new NegativeSentiment();
16 | String text = "四川在线—绵阳频道讯 (周兰兰 记者 付江)8月7日,绵阳涪城区法院对5名“90后”被告人犯抢劫罪一案进行了公开宣判。"
17 | + "5名被告人分别被处以有期徒刑10至13年,并处罚金1万元至1.5万元不等,剥夺政治权利1至2年。该案的处理秉承了该院对于刑事"
18 | + "暴力犯罪案件长期以来的严打高压态势。经审理查明,被告人小平、小涛、小春、小虎、小洋5人经事先预谋,在2013年12月24日"
19 | + "至2014年1月1日不到10天的时间内,驾驶一辆红色“英伦”轿车,先后7次在绵阳城区、江油、三台、成都等地采取蒙面、持刀拦路"
20 | + "、语言威胁、搜身、殴打等方式,抢劫过路行人手机、钱包等贵重物品。2014年1月10日,被告人小平、小涛被公安机关抓获归案"
21 | + ",小涛在被公安机关抓获后协助公安机关抓获同案被告人小虎、小春。2014年1月11日,被告人小洋被公安机关抓获归案。审理期"
22 | + "间,5被告亲属分别代被告人退赔赃款及赔偿款人民币各1万元。并与受害人之一雷某达成民事赔偿协议并已履行,取得被害人谅解"
23 | + "。法院认为,五名被告以非法占有为目的,采取暴力、胁迫方式,强行劫取公私财物,其行为触犯了国家刑律,均已构成抢劫罪,"
24 | + "且属“多次抢劫”。应依法惩处。被告人小涛协助公安机关抓获同案被告人,属立功,可以从轻或者减轻处罚。五名被告当庭自愿认"
25 | + "罪,且积极退赃款,并主动赔偿给被害人造成的损失,取得被害人谅解,可酌情从轻处罚。最终,依照《中华人民共和国刑法》第"
26 | + "二百六十三条“以暴力、胁迫或者其他方法抢劫公私财物的,处三年以上十年以下有期徒刑,并处罚金;有‘多次抢劫或者抢劫数额"
27 | + "巨大的’等情形之一的,处十年以上有期徒刑、无期徒刑或者死刑,并处罚金或者没收财产”之规定,法院作出前诉判决。据该案的"
28 | + "主审法官介绍,该案的5名被告文化程度都不高,均是小学文化,从小未受到良好的教育,加之好逸恶劳,梦想不劳而获,几个同龄"
29 | + "人一拍即合,才会犯下这样的罪行。不仅给受害人身心造成了严重伤害,也让自己的家人伤心、失望,庭审中,5名当事人都表示追"
30 | + "悔莫及。奉劝那些期望通过“特殊途径”致富的人及时悬崖勒马,勤劳致富方能长久。";
31 | System.out.println(negativeSentiment.getTextScore(text));
32 | negativeSentiment.cleanup();
33 | ```
34 |
35 |
36 | #### 开发人员
37 |
38 | WeChat: wgybzb
39 |
40 | QQ: 1010437118
41 |
42 | E-mail: wgybzb@sina.cn
43 |
44 |
45 |
--------------------------------------------------------------------------------
/ik_dic/ext_ik.dic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ml-distribution/negative-sentiment/e1a8cbba642e32e4f6211109f387faf4f1819f22/ik_dic/ext_ik.dic
--------------------------------------------------------------------------------
/ik_dic/stopwords_ik.dic:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ml-distribution/negative-sentiment/e1a8cbba642e32e4f6211109f387faf4f1819f22/ik_dic/stopwords_ik.dic
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
3 | 4.0.0
4 |
5 |
6 | zx.soft
7 | common-parent
8 | 1.0.0
9 |
10 |
11 | negative-sentiment
12 | 2.0.0
13 | Negative Sentiment
14 | Analyzing the Negative Public Opinion.
15 |
16 |
17 |
18 | zx.soft
19 | common-utils
20 | 1.0.0
21 |
22 |
23 | zx.soft
24 | analyzer-ik
25 | 2.0.0
26 |
27 |
28 | org.apache.solr
29 | solr-core
30 |
31 |
32 |
33 |
34 | zx.soft
35 | analyzer-mmseg4j
36 | 2.0.0
37 |
38 |
39 | org.apache.solr
40 | solr-core
41 |
42 |
43 |
44 |
45 | org.apache.lucene
46 | lucene-core
47 |
48 |
49 |
50 | ch.qos.logback
51 | logback-classic
52 |
53 |
54 | ch.qos.logback
55 | logback-core
56 |
57 |
58 | ch.qos.logback
59 | logback-access
60 |
61 |
62 | org.slf4j
63 | slf4j-api
64 |
65 |
66 |
67 | org.restlet.jse
68 | org.restlet
69 |
70 |
71 |
72 | junit
73 | junit
74 | test
75 |
76 |
77 |
78 |
79 |
80 |
81 | org.apache.maven.plugins
82 | maven-compiler-plugin
83 |
84 |
85 | org.apache.maven.plugins
86 | maven-source-plugin
87 |
88 |
89 | org.apache.maven.plugins
90 | maven-resources-plugin
91 |
92 |
93 | org.apache.maven.plugins
94 | maven-surefire-plugin
95 |
96 |
97 | org.apache.maven.plugins
98 | maven-jar-plugin
99 |
100 |
101 | logback.xml
102 | web-server.properties
103 |
104 |
105 |
106 |
107 | maven-assembly-plugin
108 |
109 |
110 | src/main/assembly/distribution.xml
111 |
112 |
113 |
114 |
115 | make-assembly
116 | package
117 |
118 | single
119 |
120 |
121 |
122 |
123 |
124 | org.codehaus.mojo
125 | exec-maven-plugin
126 |
127 |
128 |
129 | ${project.artifactId}-${project.version}
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 | zxsoft-public
138 | Nexus Release Repository
139 | http://192.168.3.23:18081/nexus/content/groups/public/
140 |
141 |
142 |
143 | maven-restlet
144 | Public online Restlet repository
145 | http://maven.restlet.org
146 |
147 |
148 |
149 |
150 |
151 |
152 | zxsoft-snapshots
153 | Nexus Snapshot Repository
154 | http://192.168.3.23:18081/nexus/content/repositories/snapshots/
155 |
156 |
157 | sentiment
158 | http://192.168.3.23:18081/nexus/content/repositories/sentiment
159 |
160 |
161 |
162 |
--------------------------------------------------------------------------------
/python/NegativeSentiment.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 |
4 | 'ClassifyCorpusUsingEmotionalDictionary'
5 |
6 | __author__ = 'Frank Fu'
7 |
8 | import numpy as np
9 | import re
10 | import jieba.posseg
11 | import logging
12 |
13 | #Load user dictionary to increse segmentation accuracy
14 | jieba.load_userdict('jieba/dict.txt')
15 | logging.basicConfig(level=logging.INFO)
16 |
17 | def getTextData(filePath):
18 | lines = file(filePath).readlines()
19 | lines = ''.join(lines).decode('utf8').split('\n')
20 | noSamelines = list(set(lines)) #del same line, change data entry order
21 | noSamelines.sort(key=lines.index) #keep original data entry order
22 | lines = [line.replace(' ','') for line in lines if line.replace(' ', '')] #del empty line and spaces
23 | return lines
24 |
25 | pathPrefix = 'BasicEmotionDict/'
26 |
27 | logging.info('Begin to retrieve data from files to variables in memory')
28 | logging.info('......')
29 |
30 | # Load sentiment dictionary
31 | negwords = getTextData(pathPrefix + 'negwords')
32 |
33 | # Load adverbs of degree dictionary
34 | mostdict = getTextData(pathPrefix + 'most.txt')
35 | verydict = getTextData(pathPrefix + 'very.txt')
36 | moredict = getTextData(pathPrefix + 'more.txt')
37 | ishdict = getTextData(pathPrefix + 'ish.txt')
38 | insufficientdict = getTextData(pathPrefix + 'insufficiently.txt')
39 | inversedict = getTextData(pathPrefix + 'inverse.txt')
40 |
41 | # Load dataList
42 | dataList = getTextData('sina_user_weibos_1386599408.csv')
43 | # dataList = getTextData('weibotest.csv')
44 |
45 | logging.info('Finishing retrieving data from files to variables in memory')
46 |
47 |
48 | def getSentences(data):
49 | sentences = []
50 | punctuationList = ',.!?;…~……,。!?;...~...... '.decode('utf8')
51 | uselessPunctuationList = ',.?;…~……,。?;...~...... '.decode('utf8')
52 | current = 0
53 | begin = 0
54 | guardWord = ''
55 | for word in data:
56 | if word not in punctuationList:
57 | if current+2 < len(data):
58 | guardWord = data[current+2]
59 | else:
60 | if guardWord in punctuationList:
61 | if current+2 < len(data):
62 | guardWord = data[current+2]
63 | else:
64 | sentences.append(data[begin:current+1].strip(uselessPunctuationList))
65 | begin = current+1
66 | current += 1
67 | if begin < len(data):
68 | sentences.append(data[begin:].strip(uselessPunctuationList))
69 | return sentences
70 |
71 | def considerSentimentLevel(degreeWord, baseScore):
72 | # print 'degreeWord', degreeWord.encode('utf-8')
73 | # print 'in', baseScore
74 | if degreeWord in mostdict:
75 | baseScore *= 2.0
76 | elif degreeWord in verydict:
77 | baseScore *= 1.5
78 | elif degreeWord in moredict:
79 | baseScore *= 1.25
80 | elif degreeWord in ishdict:
81 | baseScore *= 0.5
82 | elif degreeWord in insufficientdict:
83 | baseScore *= 0.25
84 | elif degreeWord in inversedict:
85 | baseScore *= -1
86 | # print 'out', baseScore
87 | return baseScore
88 |
89 | def getWordList(sentence):
90 | gen = jieba.cut(sentence) #jieba.cut(sentence) returns generator, convert to list
91 | genList = list(gen)
92 | wordList = []
93 | for word in genList:
94 | wordList.append(word)
95 | return wordList
96 |
97 | def getSingleSentenceScore(sentence):
98 | wordList = getWordList(sentence)
99 | negScore = 0
100 | wordIndex = 0
101 | sentimentWordIndex = 0
102 | for word in wordList:
103 | print word.encode('utf-8')
104 | # count basic sentiment word
105 |
106 | if word in negwords:
107 | baseScore = 1
108 | # print sentimentWordIndex, wordIndex
109 | for degreeWord in wordList[sentimentWordIndex:wordIndex]:
110 | baseScore = considerSentimentLevel(degreeWord, baseScore)
111 |
112 | if baseScore > 0:
113 | negScore += baseScore
114 |
115 | elif word == "!".decode('utf8') or word == "!".decode('utf8'):
116 | if negScore > 0:
117 | negScore += 2
118 |
119 | wordIndex += 1
120 | print negScore
121 |
122 | return negScore
123 |
124 | def getAllSentencesScore(data):
125 | sentences = getSentences(data)
126 | score = []
127 | for sentence in sentences:
128 | print sentence.encode('utf-8')
129 | score.append(getSingleSentenceScore(sentence))
130 | return score
131 |
132 | # sens = ['我喜欢粉色,那是因为我要爱你一生不变,至死不渝!']
133 | # for sen in sens:
134 | # print getAllSentencesScore(sen.decode('utf-8'))
135 |
136 | def statisticalProcess(scoreList):
137 | statisticalScoreList = []
138 | logging.info('Begin statisticalProcess')
139 | logging.info('......')
140 | for score in scoreList:
141 | score_array = np.array(score)
142 | Neg = np.sum(score_array)
143 | AvgNeg = np.mean(score_array)
144 | StdNeg = np.std(score_array)
145 | statisticalScoreList.append([Neg, AvgNeg, StdNeg])
146 | logging.info('Finish statisticalProcess')
147 | return statisticalScoreList
148 |
149 | def getScore(dataList):
150 | scoreList = []
151 | logging.info('Begin to getAllSentencesScore')
152 | logging.info('......')
153 | for data in dataList:
154 | data = re.sub(r"[a-zA-Z0-9_:/\'\"]", " ", data) #replace char and digit with space
155 | scoreList.append(getAllSentencesScore(data))
156 | logging.info('Finish getAllSentencesScore')
157 |
158 | return statisticalProcess(scoreList)
159 |
160 | def writeScoreIntoFile(scoreList, filePath):
161 | outputFile = open(filePath,'w')
162 | logging.info('Begin to write data into ' + filePath)
163 | for score in scoreList:
164 | outputFile.write('%4s %16s %16s\n' % (str(score[0]),str(score[1]), str(score[2])))
165 | outputFile.close()
166 | logging.info('......')
167 | logging.info('Finish writing data into ' + filePath)
168 |
169 |
170 | def getScoreFile(dataList, filePath):
171 | score = getScore(dataList)
172 | writeScoreIntoFile(score, filePath)
173 |
174 | if __name__ == '__main__':
175 | logging.info('Main function begin!')
176 | logging.info('-----------------------------')
177 | getScoreFile(dataList, 'score.txt')
178 | logging.info('-----------------------------')
179 | logging.info('Main function ended!')
--------------------------------------------------------------------------------
/src/main/assembly/distribution.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 | distribution
7 |
8 | tar.gz
9 |
10 | ${project.artifactId}
11 |
12 |
13 | src/main/resources
14 |
15 | log4j.properties
16 | web-server.properties
17 |
18 | /conf
19 | true
20 |
21 |
22 | ik_dic
23 |
24 | *
25 |
26 | /ik_dic
27 |
28 |
29 | src/main/bin
30 |
31 | *
32 |
33 | /bin
34 | 0755
35 |
36 |
37 |
38 |
39 | /lib
40 |
41 |
42 |
--------------------------------------------------------------------------------
/src/main/bin/ctl.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | mainClass=zx.soft.negative.sentiment.driver.NegativeSentimentDriver
4 |
5 | # resolve links - $0 may be a softlink
6 | PRG="$0"
7 |
8 | while [ -h "$PRG" ]; do
9 | ls=`ls -ld "$PRG"`
10 | link=`expr "$ls" : '.*-> \(.*\)$'`
11 | if expr "$link" : '/.*' > /dev/null; then
12 | PRG="$link"
13 | else
14 | PRG=`dirname "$PRG"`/"$link"
15 | fi
16 | done
17 |
18 | # Get standard environment variables
19 | PRGDIR=`dirname "$PRG"`
20 |
21 | PROJECT_DIR=`cd "$PRGDIR/.." >/dev/null; pwd`
22 | echo PROJECT_DIR=$PROJECT_DIR
23 |
24 | CLASSPATH="$CLASSHPATH:$PROJECT_DIR/conf"
25 |
26 | for jar in "$PROJECT_DIR/lib"/*.jar; do
27 | CLASSPATH="$CLASSPATH:$jar"
28 | done
29 | echo CLASSPATH=$CLASSPATH
30 |
31 | JVMARGS="${JVMARGS} -Dproject_dir=${PROJECT_DIR}"
32 | echo JVMARGS=$JVMARGS
33 |
34 | usage() {
35 | echo >&2 "usage: $PRG [args]"
36 | echo 'Valid commands: start, stop'
37 | exit 1
38 | }
39 |
40 | start() {
41 | JAVA=${JAVA-'java'}
42 | exec $JAVA $JVMARGS -classpath "$CLASSPATH" $mainClass "$@" &
43 | }
44 |
45 | case $1 in
46 | (start)
47 | shift
48 | start $@
49 | ;;
50 | (stop)
51 | echo "stop"
52 | ;;
53 | (restart)
54 | echo "restart"
55 | ;;
56 | (*)
57 | echo >&2 "$PRG: error: unknown command '$1'"
58 | usage
59 | ;;
60 | esac
61 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/analyzer/AnalyzerTool.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.analyzer;
2 |
3 | import java.io.IOException;
4 | import java.io.StringReader;
5 | import java.util.ArrayList;
6 | import java.util.HashMap;
7 | import java.util.List;
8 |
9 | import org.apache.lucene.analysis.Analyzer;
10 | import org.apache.lucene.analysis.TokenStream;
11 | import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
12 | import org.apache.lucene.util.Version;
13 | import org.slf4j.Logger;
14 | import org.slf4j.LoggerFactory;
15 |
16 | import cc.pp.analyzer.ik.lucene.IKAnalyzer;
17 |
18 | /**
19 | * 分词工具类
20 | *
21 | * @author wanggang
22 | *
23 | */
24 | public class AnalyzerTool {
25 |
26 | private static Logger logger = LoggerFactory.getLogger(AnalyzerTool.class);
27 |
28 | private final Analyzer analyzer;
29 |
30 | public AnalyzerTool() {
31 | analyzer = new IKAnalyzer(Version.LUCENE_48, true);
32 | }
33 |
34 | public HashMap getWordAndCounts(String text) {
35 | HashMap result = new HashMap<>();
36 | List words = analyzerTextToList(text);
37 | for (String word : words) {
38 | if (result.get(word) == null) {
39 | result.put(word, 1);
40 | } else {
41 | result.put(word, result.get(word) + 1);
42 | }
43 | }
44 | return result;
45 | }
46 |
47 | /**
48 | * 中文分词->获取文本的关键字向量
49 | * @param text: 待分词文本
50 | * @param splitToken:分割符
51 | */
52 | public String analyzerTextToStr(String text, String splitToken) {
53 | StringBuffer result = new StringBuffer();
54 | List temp = analyzerTextToList(text);
55 | for (String str : temp) {
56 | result.append(str).append(splitToken);
57 | }
58 | if (result.lastIndexOf(splitToken) > 0) {
59 | return result.toString().substring(0, result.lastIndexOf(splitToken));
60 | } else {
61 | return "";
62 | }
63 | }
64 |
65 | public String[] analyzerTextToArr(String text) {
66 | List result = analyzerTextToList(text);
67 | return result.toArray(new String[result.size()]);
68 | }
69 |
70 | public List analyzerTextToList(String text) {
71 | List result = new ArrayList<>();
72 | try (TokenStream tokenStream = analyzer.tokenStream(null, new StringReader(text))) {
73 | CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
74 | tokenStream.reset();
75 | while (tokenStream.incrementToken()) {
76 | result.add(charTermAttribute.toString());
77 | }
78 | tokenStream.end();
79 | } catch (IOException e) {
80 | logger.error("Exception:{}, StackTrace:{}", e.getMessage(), e.getStackTrace());
81 | throw new RuntimeException(e);
82 | }
83 | return result;
84 | }
85 |
86 | public void close() {
87 | if (analyzer != null) {
88 | analyzer.close();
89 | }
90 | }
91 |
92 | }
93 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/core/AdvertisementClassify.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.core;
2 |
3 | import java.util.List;
4 |
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | import zx.soft.utils.file.ReadFileUtils;
9 |
10 | public class AdvertisementClassify extends ClassifySentiment {
11 |
12 | private static Logger logger = LoggerFactory.getLogger(AdvertisementClassify.class);
13 |
14 | public AdvertisementClassify() {
15 | super();
16 | logger.info("Initing negative-words Starting ...");
17 | // advertisement
18 | emotionDictionary.setCatewords(ReadFileUtils.getFileToListFromResources(BASE_DIR
19 | + "advertisement-words-20140827"));
20 | logger.info("Initing negative-words Finishing ...");
21 | }
22 |
23 | @Override
24 | public float getSentenceScore(String sentence) {
25 | List words = analyzerTool.analyzerTextToList(sentence);
26 | float advScore = 0.0f;
27 | float baseScore = 0.0f;
28 | int wordIndex = 0;
29 | int sentimentWordsIndex = 0;
30 | for (String word : words) {
31 | // System.out.println(word);
32 | if (emotionDictionary.getCatewords().contains(word)) {
33 | // System.out.println("advertisement: " + word);
34 | baseScore = 1;
35 | for (int i = sentimentWordsIndex; i <= wordIndex; i++) {
36 | baseScore *= sentimentLevel(words.get(i));
37 | }
38 | if (Float.compare(baseScore, 0.0f) == 1) {
39 | advScore += baseScore;
40 | }
41 | sentimentWordsIndex = wordIndex + 1;
42 | } else if ((word.equals("!") || word.equals("!"))) {
43 | if (Float.compare(advScore, 0.0f) == 1) {
44 | advScore += 2;
45 | }
46 | }
47 | wordIndex++;
48 | }
49 |
50 | return advScore;
51 | }
52 |
53 | /**
54 | * 这里不考虑程度副词
55 | */
56 | @Override
57 | public float sentimentLevel(String degreeWord) {
58 | return 1;
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/core/ClassifySentiment.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.core;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | import zx.soft.negative.sentiment.analyzer.AnalyzerTool;
7 | import zx.soft.negative.sentiment.domain.EmotionDictionary;
8 | import zx.soft.utils.file.ReadFileUtils;
9 |
10 | /**
11 | * 與请分类抽象类
12 | *
13 | * @author wanggang
14 | *
15 | */
16 | public abstract class ClassifySentiment {
17 |
18 | protected final EmotionDictionary emotionDictionary;
19 |
20 | protected static final String BASE_DIR = "emotion_dict/";
21 |
22 | private static final String PUNCTUALS = ",.!?;…~……,。!?;...~...... ";
23 | private static final String PUNCTUALS_UNUSED = "[,.?;…~……,。?;...~...... ]";
24 |
25 | // 注意:分词器要使用完整的分词器,不要去除停用词。
26 | protected final AnalyzerTool analyzerTool;
27 |
28 | public ClassifySentiment() {
29 | analyzerTool = new AnalyzerTool();
30 | emotionDictionary = new EmotionDictionary();
31 | init();
32 | }
33 |
34 | /**
35 | * 初始化
36 | */
37 | private void init() {
38 | // insufficiently
39 | emotionDictionary.setInsufficiently(ReadFileUtils.getFileToListFromResources(BASE_DIR + "insufficiently"));
40 | // inverse
41 | emotionDictionary.setInverse(ReadFileUtils.getFileToListFromResources(BASE_DIR + "inverse"));
42 | // ish
43 | emotionDictionary.setIsh(ReadFileUtils.getFileToListFromResources(BASE_DIR + "ish"));
44 | // more
45 | emotionDictionary.setMore(ReadFileUtils.getFileToListFromResources(BASE_DIR + "more"));
46 | // most
47 | emotionDictionary.setMost(ReadFileUtils.getFileToListFromResources(BASE_DIR + "most"));
48 | // over
49 | emotionDictionary.setOver(ReadFileUtils.getFileToListFromResources(BASE_DIR + "over"));
50 | // very
51 | emotionDictionary.setVery(ReadFileUtils.getFileToListFromResources(BASE_DIR + "very"));
52 | }
53 |
54 | /**
55 | * 分句:对输入的文本进行分句
56 | */
57 | public List getSentences(String text) {
58 | List sentences = new ArrayList<>();
59 | int current = 0;
60 | int begin = 0;
61 | char guardWord = 0;
62 | for (char c : text.toCharArray()) {
63 | if (!PUNCTUALS.contains(c + "")) {
64 | if (current + 2 < text.length()) {
65 | guardWord = text.charAt(current + 2);
66 | }
67 | } else {
68 | if (PUNCTUALS.contains(guardWord + "")) {
69 | if (current + 2 < text.length()) {
70 | guardWord = text.charAt(current + 2);
71 | }
72 | } else {
73 | sentences.add(text.substring(begin, current + 1).trim().replaceAll(PUNCTUALS_UNUSED, ""));
74 | begin = current + 1;
75 | }
76 | }
77 | current += 1;
78 | }
79 | if (begin < text.length()) {
80 | sentences.add(text.substring(begin).trim().replaceAll(PUNCTUALS_UNUSED, ""));
81 | }
82 |
83 | return sentences;
84 | }
85 |
86 | /**
87 | * 计算每个文本的得分
88 | */
89 | public float getTextScore(String text) {
90 | float score = 0.0f;
91 | List sentences = getSentences(text);
92 | for (String sentence : sentences) {
93 | score += getSentenceScore(sentence);
94 | }
95 |
96 | return score;
97 | }
98 |
99 | /**
100 | * 计算每句话的得分
101 | */
102 | public abstract float getSentenceScore(String sentence);
103 |
104 | /**
105 | * 计算程度副词权值
106 | */
107 | public abstract float sentimentLevel(String degreeWord);
108 |
109 | public void cleanup() {
110 | analyzerTool.close();
111 | }
112 |
113 | }
114 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/core/NegativeClassify.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.core;
2 |
3 | import java.util.List;
4 |
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | import zx.soft.utils.file.ReadFileUtils;
9 |
10 | /**
11 | * 负面信息分类
12 | *
13 | * @author wanggang
14 | *
15 | */
16 | public class NegativeClassify extends ClassifySentiment {
17 |
18 | private static Logger logger = LoggerFactory.getLogger(NegativeClassify.class);
19 |
20 | public NegativeClassify() {
21 | super();
22 | logger.info("Initing negative-words Starting ...");
23 | // negwords
24 | emotionDictionary.setCatewords(ReadFileUtils.getFileToListFromResources(BASE_DIR + "negative-words-20140810"));
25 | logger.info("Initing negative-words Finishing ...");
26 | }
27 |
28 | @Override
29 | public float getSentenceScore(String sentence) {
30 | List words = analyzerTool.analyzerTextToList(sentence);
31 | float negScore = 0.0f;
32 | float baseScore = 0.0f;
33 | int wordIndex = 0;
34 | int sentimentWordsIndex = 0;
35 | for (String word : words) {
36 | // System.out.println(word);
37 | if (emotionDictionary.getCatewords().contains(word)) {
38 | // System.out.println("negword: " + word);
39 | baseScore = 1;
40 | for (int i = sentimentWordsIndex; i <= wordIndex; i++) {
41 | baseScore *= sentimentLevel(words.get(i));
42 | }
43 | if (Float.compare(baseScore, 0.0f) == 1) {
44 | negScore += baseScore;
45 | }
46 | sentimentWordsIndex = wordIndex + 1;
47 | } else if ((word.equals("!") || word.equals("!"))) {
48 | if (Float.compare(negScore, 0.0f) == 1) {
49 | negScore += 2;
50 | }
51 | }
52 | wordIndex++;
53 | }
54 |
55 | return negScore;
56 | }
57 |
58 | @Override
59 | public float sentimentLevel(String degreeWord) {
60 | if (emotionDictionary.getMost().contains(degreeWord)) {
61 | return 2.0f;
62 | } else if (emotionDictionary.getVery().contains(degreeWord)) {
63 | return 1.5f;
64 | } else if (emotionDictionary.getMore().contains(degreeWord)) {
65 | return 1.25f;
66 | } else if (emotionDictionary.getIsh().contains(degreeWord)) {
67 | return 0.5f;
68 | } else if (emotionDictionary.getInsufficiently().contains(degreeWord)) {
69 | return 0.25f;
70 | } else if (emotionDictionary.getInverse().contains(degreeWord)) {
71 | return -1f;
72 | } else {
73 | return 1f;
74 | }
75 | }
76 |
77 | }
78 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/demo/AdvertisementClassifyDemo.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.demo;
2 |
3 | import zx.soft.negative.sentiment.core.AdvertisementClassify;
4 |
5 | public class AdvertisementClassifyDemo {
6 |
7 | public static void main(String[] args) {
8 |
9 | AdvertisementClassify advClassify = new AdvertisementClassify();
10 | String text = "2014雪花勇闯天涯“挑战未登峰”选拔赛现正全国火热进行中,雪花啤酒邀您共赴征程。以“挑战未登峰”为主题的2014勇闯天涯活动"
11 | + ",将要对从来无人登顶的山峰进行挑战性开拓性的攀登!勇闯从未止步,勇闯因你而非凡!征程即刻开启,活动详情可关注@雪花啤酒勇闯" //
12 | + "天涯。 |雪花勇闯天涯挑战未登峰邀您共赴征程!";
13 | System.out.println(advClassify.getTextScore(text));
14 | advClassify.cleanup();
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/demo/NegativeClassifyDemo.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.demo;
2 |
3 | import zx.soft.negative.sentiment.core.NegativeClassify;
4 |
5 | public class NegativeClassifyDemo {
6 |
7 | public static void main(String[] args) {
8 |
9 | NegativeClassify negativeClassify = new NegativeClassify();
10 | String text = "综合消息,近日,湖南湘潭县妇幼保健院一产妇死亡,经媒体报道引发关注。据“央视新闻”消息,湘潭县卫生局称,胎儿出生后产妇出现呕吐呛咳,"
11 | + "院方立即抢救,但产妇因羊水栓塞引发多器官功能衰竭,抢救无效死亡。目前湘潭县卫生局、司法局已介入调查。据此前媒体报道,10日上午11点,医生"
12 | + "给张女士做了产前检查,胎位正常,由于胎儿较重,医生建议家属做剖腹产。随后,张女士被推进五楼的手术室。12点05分,手术室护士告诉家属,产妇顺"
13 | + "利产下宝宝。半个小时后,护士通知守在手术室外的刘先生,称产妇出现大出血情况,刘先生说,1个小时后,护士又通知他,称出血情况没止住,要其赶紧"
14 | + "去买止血药。下午5点左右,一名护士通知刘先生,称产妇大出血,现在必须切除子宫,需要签字。晚上9点,刘先生家人听到有人在议论,说产妇已经死了。"
15 | + "情急之下的刘先生上前使劲拍打手术室的大门,这时,出来一个自称是代理院长的人,说产妇仍在抢救,有脉搏。刘先生只得在外继续焦急地等待。直到"
16 | + "晚上11点,刘先生再也按捺不住,再次敲门,询问护士情况,可此时,手术室内没有任何人回答他,因为手术室的门被反锁,刘先生不得不撬开手术室的大门"
17 | + "。可进去之后,刘先生看到的了让他难以置信的一幕:妻子赤身裸体躺在手术台上,满口鲜血,眼睛里还含着泪水,可却再也没有了呼吸。而本应该在抢救"
18 | + "的医生和护士,却全体失踪了,房间里只有一些不明身份的男子在吃着槟榔,抽着烟。针对此事,湘潭县卫生局称,8月10日12点05分胎儿出生后,产妇出现"
19 | + "呕吐呛咳,院方立即抢救,但产妇因羊水栓塞引发多器官功能衰竭,抢救无效于21点30分死亡。目前湘潭县卫生局、司法局已介入调查。";
20 | System.out.println(negativeClassify.getTextScore(text));
21 | negativeClassify.cleanup();
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/domain/EmotionDictionary.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.domain;
2 |
3 | import java.util.List;
4 |
5 | public class EmotionDictionary {
6 |
7 | // 程度副词
8 | private List insufficiently;
9 | private List ish;
10 | private List more;
11 | private List most;
12 | private List over;
13 | private List very;
14 | // 负性词表
15 | private List catewords;
16 | // 否定副词
17 | private List inverse;
18 |
19 | @Override
20 | public String toString() {
21 | return "EmotionDictionary:[insufficiently=" + insufficiently + ",ish=" + ish + ",more=" + more + ",most="
22 | + most + ",over=" + over + ",very=" + very + ",inverse=" + inverse + ",negwords=" + catewords + "]";
23 | }
24 |
25 | public List getInsufficiently() {
26 | return insufficiently;
27 | }
28 |
29 | public void setInsufficiently(List insufficiently) {
30 | this.insufficiently = insufficiently;
31 | }
32 |
33 | public List getIsh() {
34 | return ish;
35 | }
36 |
37 | public void setIsh(List ish) {
38 | this.ish = ish;
39 | }
40 |
41 | public List getMore() {
42 | return more;
43 | }
44 |
45 | public void setMore(List more) {
46 | this.more = more;
47 | }
48 |
49 | public List getMost() {
50 | return most;
51 | }
52 |
53 | public void setMost(List most) {
54 | this.most = most;
55 | }
56 |
57 | public List getOver() {
58 | return over;
59 | }
60 |
61 | public void setOver(List over) {
62 | this.over = over;
63 | }
64 |
65 | public List getVery() {
66 | return very;
67 | }
68 |
69 | public void setVery(List very) {
70 | this.very = very;
71 | }
72 |
73 | public List getCatewords() {
74 | return catewords;
75 | }
76 |
77 | public void setCatewords(List catewords) {
78 | this.catewords = catewords;
79 | }
80 |
81 | public List getInverse() {
82 | return inverse;
83 | }
84 |
85 | public void setInverse(List inverse) {
86 | this.inverse = inverse;
87 | }
88 |
89 | }
90 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/domain/TextScorePost.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.domain;
2 |
3 |
4 | /**
5 | * 文本评分输入数据
6 | *
7 | * @author wanggang
8 | *
9 | */
10 | public class TextScorePost {
11 |
12 | /*
13 | * 评分类型,adv-广告评分,neg-负面信息评分
14 | */
15 | private String type;
16 | // 待评分文本
17 | private String text;
18 |
19 | public String getType() {
20 | return type;
21 | }
22 |
23 | public void setType(String type) {
24 | this.type = type;
25 | }
26 |
27 | public String getText() {
28 | return text;
29 | }
30 |
31 | public void setText(String text) {
32 | this.text = text;
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/driver/NegativeSentimentDriver.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.driver;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 |
6 | import zx.soft.negative.sentiment.web.TextScoreServer;
7 | import zx.soft.utils.driver.ProgramDriver;
8 |
9 | /**
10 | * 驱动类
11 | *
12 | * @author wanggang
13 | *
14 | */
15 | public class NegativeSentimentDriver {
16 |
17 | private static Logger logger = LoggerFactory.getLogger(NegativeSentimentDriver.class);
18 |
19 | /**
20 | * 主函数
21 | */
22 | public static void main(String[] args) {
23 |
24 | if (args.length == 0) {
25 | System.err.println("Usage: Driver ");
26 | System.exit(-1);
27 | }
28 |
29 | int exitCode = -1;
30 | ProgramDriver pgd = new ProgramDriver();
31 | try {
32 | pgd.addClass("textScoreServer", TextScoreServer.class, "與请信息评分接口");
33 | pgd.driver(args);
34 | // Success
35 | exitCode = 0;
36 | } catch (Throwable e) {
37 | logger.error("Exception:{}, StackTrace:{}", e.getMessage(), e.getStackTrace());
38 | throw new RuntimeException(e);
39 | }
40 | System.exit(exitCode);
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/web/TextScoreApplication.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.web;
2 |
3 | import org.restlet.Application;
4 | import org.restlet.Restlet;
5 | import org.restlet.routing.Router;
6 |
7 | import zx.soft.negative.sentiment.core.AdvertisementClassify;
8 | import zx.soft.negative.sentiment.core.NegativeClassify;
9 |
10 | /**
11 | * 情感分类应用类
12 | *
13 | * @author wanggang
14 | *
15 | */
16 | public class TextScoreApplication extends Application {
17 |
18 | private final AdvertisementClassify advClassify;
19 | private final NegativeClassify negativeClassify;
20 |
21 | public TextScoreApplication() {
22 | advClassify = new AdvertisementClassify();
23 | negativeClassify = new NegativeClassify();
24 | }
25 |
26 | @Override
27 | public Restlet createInboundRoot() {
28 | Router router = new Router(getContext());
29 | router.attach("/score", TextScoreResource.class);
30 | return router;
31 | }
32 |
33 | /**
34 | * 评分类型
35 | * @param text:待评分文本
36 | * @param type:评分类型,adv-广告评分,neg-负面信息评分
37 | * @return
38 | */
39 | public float getTextScore(String text, String type) {
40 | if (text == null || text.length() == 0 || type == null || type.length() == 0) {
41 | return 0.0f;
42 | }
43 | if ("adv".equalsIgnoreCase(type)) {
44 | return advClassify.getTextScore(text);
45 | } else if ("neg".equalsIgnoreCase(type)) {
46 | return negativeClassify.getTextScore(text);
47 | } else { // 参数传入错误
48 | return 0.0f;
49 | }
50 | }
51 |
52 | public void close() {
53 | advClassify.cleanup();
54 | negativeClassify.cleanup();
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/web/TextScoreResource.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.web;
2 |
3 | import org.restlet.resource.Post;
4 | import org.restlet.resource.ServerResource;
5 | import org.slf4j.Logger;
6 | import org.slf4j.LoggerFactory;
7 |
8 | import zx.soft.negative.sentiment.domain.TextScorePost;
9 | import zx.soft.utils.codec.URLCodecUtils;
10 |
11 | /**
12 | * 情感分类资源类
13 | *
14 | * @author wanggang
15 | *
16 | */
17 | public class TextScoreResource extends ServerResource {
18 |
19 | private static Logger logger = LoggerFactory.getLogger(TextScoreResource.class);
20 |
21 | private TextScoreApplication application;
22 |
23 | @Override
24 | public void doInit() {
25 | application = (TextScoreApplication) getApplication();
26 | logger.info("Request Url: " + URLCodecUtils.decoder(getReference().toString(), "utf-8") + ".");
27 | }
28 |
29 | @Post("json")
30 | public Object returnTextScore(TextScorePost textScorePost) {
31 | return application.getTextScore(textScorePost.getText(), textScorePost.getType()) + "";
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/zx/soft/negative/sentiment/web/TextScoreServer.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.web;
2 |
3 | import java.util.Properties;
4 |
5 | import org.restlet.Component;
6 | import org.restlet.data.Protocol;
7 |
8 | import zx.soft.utils.config.ConfigUtil;
9 | import zx.soft.utils.jackson.ReplaceConvert;
10 |
11 | /**
12 | * 與请数据评分服务:包括广告信息评分、负面信息评分
13 | *
14 | * POST: http://localhost:XXXX/sentiment/score
15 | * 传入参数:TextScorePost对象,包含type和text两个参数。
16 | *
17 | * @author wanggang
18 | *
19 | */
20 | public class TextScoreServer {
21 |
22 | private final Component component;
23 | private final TextScoreApplication naiveBayesApplication;
24 |
25 | private final int PORT;
26 |
27 | public TextScoreServer() {
28 | Properties props = ConfigUtil.getProps("web-server.properties");
29 | PORT = Integer.parseInt(props.getProperty("api.port"));
30 | component = new Component();
31 | naiveBayesApplication = new TextScoreApplication();
32 | }
33 |
34 | /**
35 | * 主函数
36 | */
37 | public static void main(String[] args) {
38 |
39 | TextScoreServer server = new TextScoreServer();
40 | server.start();
41 |
42 | }
43 |
44 | public void start() {
45 | component.getServers().add(Protocol.HTTP, PORT);
46 | try {
47 | component.getDefaultHost().attach("/sentiment", naiveBayesApplication);
48 | ReplaceConvert.configureJacksonConverter();
49 | component.start();
50 | } catch (Exception e) {
51 | throw new RuntimeException(e);
52 | }
53 | }
54 |
55 | public void stop() {
56 | try {
57 | component.stop();
58 | naiveBayesApplication.close();
59 | } catch (Exception e) {
60 | throw new RuntimeException(e);
61 | }
62 | }
63 |
64 | }
65 |
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/advertisement-words-20140827:
--------------------------------------------------------------------------------
1 | 绑定
2 | 宝贝
3 | 背景
4 | 比亚迪
5 | 表情
6 | 表态
7 | 播放
8 | 参加
9 | 查看
10 | 长足进步
11 | 超级
12 | 呈现
13 | 赤城
14 | 筹码
15 | 出了
16 | 春季
17 | 错过
18 | 大奖
19 | 代购
20 | 单人
21 | 耽误
22 | 当前
23 | 德州
24 | 等功能
25 | 等你
26 | 地址
27 | 点开
28 | 电影
29 | 调整
30 | 冬冬
31 | 冬季
32 | 冬装
33 | 都是
34 | 队列
35 | 多张
36 | 二维码
37 | 发布
38 | 发送
39 | 返回
40 | 分享
41 | 分组
42 | 粉丝
43 | 封面
44 | 风格
45 | 服了
46 | 服务
47 | 辅助
48 | 改变
49 | 改造
50 | 赶紧
51 | 高清
52 | 格子
53 | 个人主页
54 | 个性
55 | 给你
56 | 更多
57 | 更新
58 | 功能
59 | 工装
60 | 购物
61 | 观看
62 | 广场
63 | 广告
64 | 过了
65 | 还不
66 | 好看
67 | 好听
68 | 好玩
69 | 好友
70 | 很漂亮
71 | 后悔
72 | 滑动
73 | 换新装
74 | 回复
75 | 会员
76 | 活动
77 | 获取
78 | 即可
79 | 加厚
80 | 加载
81 | 架构
82 | 简洁
83 | 简约
84 | 交换
85 | 接收
86 | 界面
87 | 今天
88 | 仅此
89 | 惊喜
90 | 晶莹
91 | 精彩
92 | 卡片
93 | 开启
94 | 烤肉
95 | 可拆卸
96 | 可怜
97 | 客服
98 | 客户端
99 | 快来
100 | 快人
101 | 快手
102 | 款式
103 | 来拿
104 | 厉害
105 | 列表
106 | 领分
107 | 领取
108 | 流量
109 | 浏览
110 | 买了
111 | 每次
112 | 每日
113 | 每天
114 | 美食
115 | 美图秀
116 | 魅力
117 | 梦想
118 | 密友
119 | 棉衣
120 | 免费
121 | 秒杀
122 | 名车
123 | 模块
124 | 内衬
125 | 能量
126 | 昵称
127 | 努力
128 | 女装
129 | 朋友
130 | 频道
131 | 聘请
132 | 屏蔽
133 | 屏幕
134 | 苹果
135 | 评论
136 | 扑克
137 | 旗舰店
138 | 祈福
139 | 汽车
140 | 抢购
141 | 抢先
142 | 清凉
143 | 轻松
144 | 秋季
145 | 趋势
146 | 全场
147 | 全城
148 | 全款
149 | 全面
150 | 全新
151 | 热门
152 | 热门话题
153 | 人气
154 | 日版
155 | 乳液
156 | 三星
157 | 散步
158 | 社区
159 | 设计
160 | 神马
161 | 神奇
162 | 升级
163 | 声道
164 | 声卡
165 | 十万
166 | 时间线
167 | 时尚
168 | 视频
169 | 试试
170 | 手机
171 | 手势
172 | 首页
173 | 授权
174 | 数量
175 | 刷着
176 | 私密
177 | 速度
178 | 淘宝
179 | 套餐
180 | 特价
181 | 提升
182 | 体验
183 | 天猫
184 | 添加
185 | 听歌
186 | 通讯录
187 | 通知
188 | 童装
189 | 图片
190 | 推出
191 | 推荐
192 | 外贸
193 | 外套
194 | 完美
195 | 微博
196 | 文章
197 | 蜗牛
198 | 无障碍
199 | 恶搞
200 | 喜欢
201 | 洗面奶
202 | 系统
203 | 下单
204 | 下载
205 | 仙人掌
206 | 显示
207 | 详情
208 | 享受
209 | 消费者
210 | 消息
211 | 销售
212 | 小花
213 | 效果
214 | 心动
215 | 新版
216 | 新款
217 | 新浪
218 | 新罗
219 | 新增
220 | 信息
221 | 信息流
222 | 宣传片
223 | 勋章
224 | 雅安
225 | 演绎
226 | 羊羔绒
227 | 养颜
228 | 邀请
229 | 要不要
230 | 一键
231 | 音乐
232 | 赢取
233 | 拥有
234 | 优化
235 | 优惠券
236 | 有限
237 | 有限公司
238 | 右上角
239 | 语音
240 | 增加
241 | 帐号
242 | 账号
243 | 折扣
244 | 这家
245 | 这么多
246 | 整合
247 | 正品
248 | 支持
249 | 支付
250 | 直接
251 | 置顶
252 | 质量
253 | 中文字幕
254 | 忠实
255 | 众多
256 | 周边
257 | 主题
258 | 主页
259 | 专属
260 | 转发
261 | 自定义
262 | 自助
263 | 最高
264 | 最喜欢
265 | 最新
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/insufficiently:
--------------------------------------------------------------------------------
1 | 半点
2 | 不大
3 | 不丁点儿
4 | 不甚
5 | 不怎么
6 | 聊
7 | 没怎么
8 | 轻度
9 | 弱
10 | 丝毫
11 | 微
12 | 相对
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/inverse:
--------------------------------------------------------------------------------
1 | 不
2 | 没
3 | 非
4 | 休
5 | 勿
6 | 莫
7 | 弗
8 | 毋
9 | 甭
10 | 未
11 | 否
12 | 别
13 | 无
14 | 干
15 | 空
16 | 徒
17 | 枉
18 | 并非
19 | 徒有
20 | 何必
21 | 何曾
22 | 何尝
23 | 何需
24 | 不够
25 | 未尝
26 | 不是
27 | 不用
28 | 不曾
29 | 不必
30 | 未必
31 | 没有
32 | 毋庸
33 | 无须
34 | 不要
35 | 不会
36 | 难以
37 | 未曾
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/ish:
--------------------------------------------------------------------------------
1 | 点点滴滴
2 | 多多少少
3 | 怪
4 | 好生
5 | 还
6 | 或多或少
7 | 略
8 | 略加
9 | 略略
10 | 略微
11 | 略为
12 | 蛮
13 | 稍
14 | 稍稍
15 | 稍微
16 | 稍为
17 | 稍许
18 | 挺
19 | 未免
20 | 相当
21 | 些
22 | 些微
23 | 些小
24 | 一点
25 | 一点儿
26 | 一些
27 | 有点
28 | 有点儿
29 | 有些
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/more:
--------------------------------------------------------------------------------
1 | 大不了
2 | 不太
3 | 不很
4 | 多
5 | 更
6 | 更加
7 | 更进一步
8 | 更为
9 | 还
10 | 还要
11 | 较
12 | 较比
13 | 比较
14 | 较为
15 | 进一步
16 | 那般
17 | 那么
18 | 那样
19 | 强
20 | 如斯
21 | 益
22 | 益发
23 | 尤甚
24 | 逾
25 | 愈
26 | 愈发
27 | 愈加
28 | 愈来愈
29 | 愈益
30 | 远远
31 | 越
32 | 越发
33 | 越加
34 | 越来越
35 | 越是
36 | 这般
37 | 这样
38 | 足
39 | 足足
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/most:
--------------------------------------------------------------------------------
1 | 至
2 | 至为
3 | 顶
4 | 过
5 | 过于
6 | 过分
7 | 分外
8 | 百分之百
9 | 倍加
10 | 备至
11 | 不得了
12 | 不堪
13 | 不可开交
14 | 不亦乐乎
15 | 不折不扣
16 | 彻头彻尾
17 | 充分
18 | 到头
19 | 地地道道
20 | 非常
21 | 极
22 | 极度
23 | 极端
24 | 极其
25 | 极为
26 | 截然
27 | 尽
28 | 惊人地
29 | 绝
30 | 绝顶
31 | 绝对
32 | 绝对化
33 | 刻骨
34 | 酷
35 | 满
36 | 满贯
37 | 满心
38 | 莫大
39 | 奇
40 | 入骨
41 | 甚为
42 | 十二分
43 | 十分
44 | 十足
45 | 死
46 | 滔天
47 | 痛
48 | 透
49 | 完全
50 | 完完全全
51 | 万
52 | 万般
53 | 万分
54 | 万万
55 | 无比
56 | 无度
57 | 无可估量
58 | 无以复加
59 | 无以伦比
60 | 要命
61 | 要死
62 | 已极
63 | 已甚
64 | 异常
65 | 逾常
66 | 贼
67 | 之极
68 | 之至
69 | 至极
70 | 卓绝
71 | 最为
72 | 佼佼
73 | 郅
74 | 綦
75 | 齁
76 | 最
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/negative-words-20140810:
--------------------------------------------------------------------------------
1 | 畏死
2 | 特警
3 | 干恁
4 | 阴谋论
5 | 示威
6 | 刀刃
7 | 窒息噎
8 | 哀哀
9 | 杀杀
10 | 飞贼
11 | 幸灾乐祸
12 | 有期徒刑
13 | 造谣
14 | 骄奢淫逸
15 | 窒息
16 | 淫邪
17 | 事故
18 | 腐败问题
19 | 黑钱
20 | 死水
21 | 暴行
22 | 毁容
23 | 必杀
24 | 致死
25 | 诬陷
26 | 杀青
27 | 抽筋
28 | 下地狱
29 | 海难
30 | 好战
31 | 挺尸
32 | 患精神病
33 | 咒骂
34 | 昭然若揭
35 | 蒙冤
36 | 猥亵
37 | 穷寇
38 | 去死吧
39 | 死心塌地
40 | 惨无天日
41 | 砍人
42 | 佞语
43 | 忿恨
44 | 死光光
45 | 诈骗案
46 | 官僚
47 | 木马
48 | 被控
49 | 危险期
50 | 刀片
51 | 匪帮
52 | 魂魄
53 | 绞死
54 | 妖里妖气
55 | 日本鬼子
56 | 制毒
57 | 认罪
58 | 女警
59 | 粪便
60 | 刀剑
61 | 癌症病人
62 | 成灾
63 | 怀恨
64 | 大地震
65 | 大粪
66 | 恨
67 | 主杀
68 | 死鱼
69 | 战役
70 | 哗众取宠
71 | 骨瘤
72 | 泛滥成灾
73 | 口袋妖怪
74 | 反动
75 | 毒刑
76 | 被害
77 | 吸血鬼
78 | 阴谋家
79 | 勾引到
80 | 灾
81 | 剿匪
82 | 报应
83 | 台湾
84 | 减灾
85 | 叛国者
86 | 逃逸
87 | 违法
88 | 罪犯
89 | 刺死
90 | 爆炸物
91 | 狗血淋头
92 | 出卖
93 | 内奸
94 | 施暴
95 | 鬼屋
96 | 污染源
97 | 好色
98 | 下流
99 | 辛亥革命
100 | 怒冲冲
101 | 尖刀
102 | 开枪
103 | 爱生恨
104 | 死色呸
105 | 空气污染
106 | 迷幻药
107 | 毒刺
108 | 被封
109 | 出警
110 | 亡命之徒
111 | 遭殃
112 | 横行霸道
113 | 傀儡
114 | 飞扬跋扈
115 | 共谋
116 | 灾祸
117 | 毒手
118 | 炸
119 | 恶贯满盈
120 | 通缉令
121 | 砍伤
122 | 弯刀
123 | 吊死
124 | 邪气
125 | 兵慌马乱
126 | 灰原哀
127 | 学潮
128 | 夙仇
129 | 煽动
130 | 黑道风云
131 | 分泌毒液
132 | 亡魂
133 | 毒打
134 | 报仇
135 | 阴恶
136 | 警车
137 | 罢课
138 | 新闻封锁
139 | 刑事责任
140 | 败国亡家
141 | 国耻
142 | 坠落
143 | 谗言
144 | 反目成仇
145 | 不要命
146 | 砍杀
147 | 另有隐情
148 | 恨不得
149 | 恶劣
150 | 剥皮
151 | 辱骂
152 | 想死
153 | 勾搭
154 | 偷窃
155 | 禁片
156 | 持证
157 | 狠心
158 | 被告
159 | 不法行为
160 | 乳腺癌
161 | 癌症
162 | 胰腺癌
163 | 窒息而死
164 | 恐怖份子
165 | 危害物
166 | 公共安全
167 | 利欲熏心
168 | 祸殃
169 | 人肉
170 | 流氓兔
171 | 葬送
172 | 集会
173 | 警徽
174 | 机八毛
175 | 违法行为
176 | 陪审团
177 | 东莞
178 | 危险
179 | 毒花
180 | 手刃
181 | 真他妈
182 | 数罪并罚
183 | 致命
184 | 游行
185 | 极恶
186 | 焚
187 | 灭口
188 | 妒恨
189 | 跩个屁
190 | 杀灭
191 | 学运
192 | 有毒腺
193 | 邪门歪道
194 | 愤
195 | 非法
196 | 出卖身体
197 | 匕首
198 | 死活
199 | 铡刀
200 | 滋事
201 | 煽动者
202 | 倭寇
203 | 灭绝师太
204 | 犯下
205 | 作风不正
206 | 豺狼横道
207 | 谋反
208 | 祸害
209 | 血腥
210 | 下毒手
211 | 地牢
212 | 迫害
213 | 谋反者
214 | 援交
215 | 法警
216 | 血祭
217 | 单刀
218 | 苦役
219 | 交警
220 | 刑事案件
221 | 盗贼
222 | 仇杀
223 | 觊觎
224 | 诡计多端
225 | 犯罪行为
226 | 刀子
227 | 精神分裂
228 | 奸诈
229 | 罪孽
230 | 等死
231 | 贪污腐败
232 | 悲观厌世
233 | 妖怪
234 | 肝癌
235 | 垂体瘤
236 | 诈尸
237 | 腐烂
238 | 喷血
239 | 枪毙
240 | 恐怖行动
241 | 最恨
242 | 伸冤
243 | 警校
244 | 害人
245 | 龌龊
246 | 黑帮
247 | 日本刀
248 | 极残忍
249 | 犯罪者
250 | 海洛因
251 | 强奸
252 | 蛇蝎
253 | 卑劣
254 | 民警
255 | 奸
256 | 祸
257 | 劫难
258 | 闯祸
259 | 诅咒
260 | 上瘾
261 | 机八
262 | 愤世
263 | 公安局
264 | 逍遥法外
265 | 淫秽
266 | 背恩弃义
267 | 帮凶
268 | 胡乱搞
269 | 草莽
270 | 祖宗十八代
271 | 残害
272 | 包藏奸心
273 | 指控
274 | 有罪
275 | 流亡
276 | 淫荡样
277 | 侵犯
278 | 咒语
279 | 贼眼
280 | 恶魔
281 | 好死
282 | 含恨
283 | 热辐射
284 | 人民武装
285 | 电子警察
286 | 拔刀
287 | 瘤子
288 | 冤
289 | 学联
290 | 老奸巨猾
291 | 有恶意
292 | 巡警
293 | 去世
294 | 污秽
295 | 菜刀
296 | 癫狂
297 | 炸药
298 | 肠癌
299 | 警衔
300 | 事件
301 | 吓死
302 | 刀叉
303 | 起火
304 | 暴敛横征
305 | 窒息状态
306 | 血战
307 | 地狱
308 | 恐怖
309 | 遗体
310 | 饿死
311 | 毒药
312 | 清场
313 | 真他妈贱
314 | 家仇
315 | 罪孽深重
316 | 不死鸟
317 | 危机
318 | 杀虫剂
319 | 毒死
320 | 丧心病狂
321 | 犯人
322 | 以权谋私
323 | 不省人事
324 | 罄竹难书
325 | 僵尸
326 | 罪名
327 | 干娘
328 | 狙击手
329 | 亡命
330 | 包藏祸心
331 | 秘密武器
332 | 跳楼
333 | 暴利
334 | 成群结党
335 | 死里逃生
336 | 饿殍
337 | 无毒
338 | 邪教
339 | 死不
340 | 刃
341 | 荒淫无度
342 | 死老太婆
343 | 窃听
344 | 魑魅
345 | 炸毁
346 | 下三烂
347 | 要死
348 | 恶名昭张
349 | 落井下石
350 | 尸体
351 | 恶毒
352 | 朋比为奸
353 | 武装
354 | 暴打
355 | 病国殃民
356 | 我操你妈
357 | 变态心理
358 | 发毛
359 | 西毒
360 | 解放碑
361 | 可耻
362 | 革命
363 | 纪检监察
364 | 鬼混
365 | 新疆人
366 | 毒害
367 | 感到恐惧
368 | 鹰犬
369 | 操你妈
370 | 生死
371 | 量刑
372 | 受害人
373 | 恶性循环
374 | 草菅人命
375 | 威吓
376 | 通缉
377 | 侵占
378 | 悲哀
379 | 打架斗殴
380 | 交警支队
381 | 恶毒攻击
382 | 外患
383 | 笨死了
384 | 盘踞
385 | 妓女
386 | 狙击
387 | 婊子
388 | 砸死
389 | 报案
390 | 荡妇
391 | 喜怒哀乐
392 | 恶名
393 | 拆迁房
394 | 防辐射
395 | 死了
396 | 带毒
397 | 假释
398 | 暴力
399 | 恶名昭着
400 | 可恶
401 | 谗害
402 | 哀伤
403 | 冤枉
404 | 浩劫
405 | 灾区
406 | 犯罪心理
407 | 私吞
408 | 迷死
409 | 嫌疑人
410 | 通杀
411 | 驾崩
412 | 暴动
413 | 腐败分子
414 | 魔鬼
415 | 禁毒
416 | 死于
417 | 骂
418 | 打骂
419 | 笑死
420 | 贱女人
421 | 自杀
422 | 干恁娘
423 | 仇恨
424 | 死亡
425 | 淫笑
426 | 恐怖主义
427 | 毒气
428 | 邪淫
429 | 撞死
430 | 死人
431 | 侵害
432 | 犯罪
433 | 淫猥
434 | 恐惧
435 | 作乱
436 | 监管局
437 | 愤青
438 | 审判
439 | 血拼
440 | 弹劾
441 | 艾滋病
442 | 系统疾病
443 | 打劫
444 | 机八事
445 | 抗病毒治疗
446 | 下坠
447 | 病民害国
448 | 电磁辐射
449 | 得罪
450 | 纤维瘤
451 | 核弹头
452 | 骂不绝口
453 | 监察部门
454 | 哀悼者
455 | 操你个鬼
456 | 宫颈癌
457 | 毒鼠强
458 | 警戒线
459 | 奸商
460 | 强拆
461 | 杂种
462 | 致癌
463 | 砍头
464 | 罪大恶极
465 | 鱼肉乡里
466 | 不杀
467 | 淫荡
468 | 肠肥脑满
469 | 申冤
470 | 虐杀
471 | 放火
472 | 逃亡者
473 | 女杀手
474 | 杀戮
475 | 勒死
476 | 臭男人
477 | 骑警
478 | 沉湎
479 | 追捕
480 | 刑拘
481 | 冤假错案
482 | 恐慌
483 | 臭名昭彰
484 | 卖国贼
485 | 掏粪
486 | 丧尸
487 | 灾害
488 | 毒针
489 | 时事政治
490 | 股骨头坏死
491 | 迷死人
492 | 去死啦
493 | 焚烧
494 | 报复
495 | 大流氓
496 | 骚扰
497 | 杀人狂
498 | 杀手
499 | 死去活来
500 | 死期
501 | 低级庸俗
502 | 非人
503 | 惨不忍睹
504 | 猖獗
505 | 去你
506 | 烧伤
507 | 搞死
508 | 死机
509 | 油炸
510 | 流血
511 | 暴卒
512 | 死地
513 | 刑事拘留
514 | 监察局
515 | 妖姬
516 | 逃犯
517 | 捉贼
518 | 毒品
519 | 精神分裂症
520 | 虐待
521 | 猥
522 | 反腐败
523 | 冤假
524 | 匪
525 | 人神共愤
526 | 冤案
527 | 魔鬼天使
528 | 歹徒
529 | 天理难容
530 | 狼狈为奸
531 | 至死不渝
532 | 滚蛋
533 | 干警
534 | 被沾污
535 | 罪恶滔天
536 | 西藏自治区
537 | 禁播
538 | 装死
539 | 烧坏
540 | 不死心
541 | 中国人民解放军
542 | 中毒
543 | 畜生
544 | 解放军
545 | 羁押
546 | 惨杀
547 | 哀怜
548 | 誓死
549 | 水性杨花
550 | 黑色幽默
551 | 纵火案
552 | 纵火
553 | 独裁
554 | 屠宰
555 | 憋死
556 | 灾民
557 | 打入地狱
558 | 欲仙欲死
559 | 精神障碍
560 | 穷凶极恶
561 | 愤怒
562 | 瘟疫
563 | 诈骗罪
564 | 悲痛
565 | 他妈妈
566 | 谗言佞语
567 | 堕落者
568 | 致癌物
569 | 死板
570 | 跩屁
571 | 死了算了
572 | 嗜杀成性
573 | 成群集党
574 | 心狠
575 | 凶暴
576 | 恩仇
577 | 世仇
578 | 奸淫
579 | 死
580 | 警戒
581 | 豺虎肆虐
582 | 刑警
583 | 砍击
584 | 毒素
585 | 打死
586 | 政治斗争
587 | 大爆炸
588 | 鬼鬼祟祟
589 | 贪得无厌
590 | 庸医
591 | 骗子
592 | 疯魔
593 | 送死
594 | 老死
595 | 老警
596 | 死性不改
597 | 遭报应
598 | 杀招
599 | 妖物
600 | 长恨歌
601 | 勾结
602 | 死心
603 | 匪首
604 | 鬼影
605 | 行窃
606 | 棚户区
607 | 酷虐
608 | 禽流感
609 | 魔咒
610 | 血淋淋
611 | 死老头
612 | 焚香
613 | 公安机关
614 | 黑道
615 | 好斗
616 | 生老病死
617 | 刑讯
618 | 心狠手辣
619 | 成群结伙
620 | 搞破坏
621 | 毒资
622 | 污名
623 | 羞辱
624 | 乱搞
625 | 杀人放火
626 | 死忠
627 | 奴隶
628 | 化粪池
629 | 不纯洁
630 | 遗臭万年
631 | 投毒
632 | 暴民
633 | 毒
634 | 愆尤
635 | 偿命
636 | 仇视
637 | 灭亡
638 | 坠地
639 | 行骗
640 | 出事
641 | 妖言惑众
642 | 淫污
643 | 勾引
644 | 草芥人命
645 | 甘你屁事
646 | 梅毒
647 | 鸡巴
648 | 篡
649 | 死者
650 | 败类
651 | 紧箍咒
652 | 警报
653 | 诡计
654 | 囚徒
655 | 流感
656 | 伤亡
657 | 哀悼
658 | 马的逼
659 | 死怕
660 | 分赃
661 | 杀人犯
662 | 腺瘤
663 | 消灾
664 | 攻击力
665 | 辐射量
666 | 监察室
667 | 厌世
668 | 凶杀
669 | 判决
670 | 泼妇
671 | 奠祭
672 | 一刀
673 | 起死回生
674 | 戒毒
675 | 绝杀
676 | 阴毒
677 | 老而不死是为贼
678 | 陷害
679 | 嫁祸于人
680 | 鸡巴毛
681 | 干屄
682 | 冤头
683 | 挥霍无度
684 | 淋巴瘤
685 | 鬼迷心窍
686 | 艾滋
687 | 假死
688 | 灭绝
689 | 喋血
690 | 刺伤
691 | 危楼
692 | 西藏
693 | 累死
694 | 枷锁
695 | 百毒不侵
696 | 肉毒素
697 | 该死
698 | 隐情
699 | 赈灾
700 | 包庇
701 | 潜逃
702 | 攻击
703 | 毒液
704 | 举报
705 | 卡死
706 | 杀死
707 | 作案工具
708 | 毒症
709 | 酒鬼
710 | 尸
711 | 三尸脑神丹
712 | 玩火者必自焚
713 | 狂暴
714 | 生死相依
715 | 操你
716 | 战警
717 | 抢劫
718 | 阴谋
719 | 洪水
720 | 扼杀
721 | 行政拘留
722 | 搞援交
723 | 刺杀
724 | 肇事者
725 | 羞耻
726 | 中毒者
727 | 死胖子
728 | 淋巴结核
729 | 死灰
730 | 侵略
731 | 必死
732 | 弥天大罪
733 | 马的咧
734 | 骂大街
735 | 自焚
736 | 糜烂性
737 | 精神病医院
738 | 性侵
739 | 作案
740 | 贪污
741 | 炸鸡
742 | 纳粹
743 | 骂人
744 | 暧昧
745 | 贼船
746 | 趋炎
747 | 团伙
748 | 操你母
749 | 杀害
750 | 生化危机
751 | 杀菌
752 | 残暴
753 | 谋杀
754 | 政治部
755 | 精神病
756 | 祸国
757 | 间谍
758 | 遭罪
759 | 通奸
760 | 危险之源
761 | 盗墓
762 | 咒
763 | 警匪
764 | 魔教
765 | 社会治安
766 | 不知羞耻
767 | 杀毒
768 | 海匪
769 | 死三八
770 | 恶习
771 | 出轨
772 | 报警器
773 | 粪
774 | 淫贱
775 | 笑死人
776 | 妖孽
777 | 击杀
778 | 切菜刀
779 | 淹死
780 | 必杀技
781 | 毒蝎子
782 | 污染物
783 | 穷途末路
784 | 伤风败俗
785 | 扣押
786 | 豺狼虎豹
787 | 匪窝
788 | 吓死人
789 | 血泪
790 | 怒骂
791 | 活死人
792 | 哀
793 | 毁灭
794 | 肺癌
795 | 海警
796 | 血洗
797 | 愤慨
798 | 荒淫
799 | 阴谋者
800 | 武警
801 | 醋意大发
802 | 我操
803 | 同罪
804 | 神圣不可侵犯
805 | 窃国
806 | 嚣张
807 | 大悲咒
808 | 没救
809 | 肿瘤科
810 | 监禁
811 | 行尸走肉
812 | 心急如焚
813 | 怨怒
814 | 禽兽不如
815 | 附势
816 | 血管瘤
817 | 奸佞
818 | 侵略性
819 | 嗜杀
820 | 被弄死
821 | 利刃
822 | 杀菌灯
823 | 急死人
824 | 粗暴
825 | 军区
826 | 台独
827 | 无污染
828 | 株连
829 | 警察局长
830 | 妇科疾病
831 | 骨坏死
832 | 狠毒
833 | 砍死
834 | 蜂毒
835 | 鱼死网破
836 | 判决书
837 | 狡诈
838 | 禁书
839 | 恶人
840 | 卑陋
841 | 赌棍
842 | 奸徒
843 | 烧焦
844 | 殴打
845 | 抗法
846 | 恐怖时期
847 | 腥臊
848 | 警讯
849 | 残杀
850 | 骚扰电话
851 | 加害
852 | 危险物
853 | 搏杀
854 | 坟墓
855 | 死光
856 | 拉黑
857 | 大兵
858 | 醉生梦死
859 | 发愤忘食
860 | 警察
861 | 贪财
862 | 兽性大发
863 | 获刑
864 | 暴敛
865 | 犯了罪
866 | 精神病患者
867 | 死党
868 | 公愤
869 | 法轮
870 | 骨肉瘤
871 | 毒蛇
872 | 王立军
873 | 救灾
874 | 利剑
875 | 糟蹋
876 | 祸心
877 | 身亡
878 | 凶恶
879 | 医疗事故
880 | 死神
881 | 歃血
882 | 蓝色妖姬
883 | 妒火中烧
884 | 行为不端
885 | 肿瘤
886 | 打赌
887 | 欲加之罪
888 | 忘恩负义
889 | 农药
890 | 笨死
891 | 拘留所
892 | 人民警察
893 | 豺狼野心
894 | 死要
895 | 坑骗
896 | 报警
897 | 天理何在
898 | 交通事故
899 | 篡改
900 | 毁灭性
901 | 噪声污染
902 | 他妈
903 | 火灾
904 | 罪不容诛
905 | 耳坠
906 | 猥琐
907 | 贼子
908 | 无罪
909 | 火烧云
910 | 内乱
911 | 逞凶
912 | 出血
913 | 拘留
914 | 狗男女
915 | 恶霸
916 | 炸弹
917 | 肢解
918 | 暴跌
919 | 破坏
920 | 赃物
921 | 藏奸
922 | 棺材
923 | 阉割
924 | 毛骨悚然
925 | 狂怒
926 | 毒杀
927 | 骂骂咧咧
928 | 黑心肠
929 | 残忍
930 | 荒淫无耻
931 | 鸡屎肚
932 | 毒蝎
933 | 知法犯法
934 | 恐怖症
935 | 动武
936 | 执法犯法
937 | 拆迁
938 | 罪恶感
939 | 死角
940 | 死胖女
941 | 经济危机
942 | 人面兽心
943 | 无辐射
944 | 腐败
945 | 仇家
946 | 小女警
947 | 有害
948 | 生死线
949 | 恐吓
950 | 侮辱
951 | 恐怖病
952 | 跋扈
953 | 民运
954 | 火烧
955 | 尿毒症
956 | 豺狼
957 | 世界末日
958 | 公安部
959 | 新疆
960 | 地震
961 | 你他妈
962 | 吸毒者
963 | 有毒
964 | 高压政治
965 | 死亡威胁
966 | 嗜血成性
967 | 怀恨者
968 | 惨遭横祸
969 | 熬刑
970 | 淫
971 | 淫乱
972 | 杀毒软件
973 | 囚禁
974 | 犯罪嫌疑人
975 | 奸恶
976 | 阴奉阳违
977 | 胃癌
978 | 死刑
979 | 蛇毒
980 | 孽种
981 | 叛乱
982 | 亡灵
983 | 专案组
984 | 游手好闲
985 | 杀敌
986 | 消毒液
987 | 火焚
988 | 死东西
989 | 抗病毒
990 | 狗党狐群
991 | 坏死
992 | 骂街
993 | 省军区
994 | 笑里藏刀
995 | 怕死
996 | 毒龙
997 | 违法违纪
998 | 核弹
999 | 倒毙
1000 | 灾难
1001 | 坠入
1002 | 暴虐
1003 | 恶运
1004 | 凶兆
1005 | 易燃
1006 | 你妈
1007 | 凶煞
1008 | 害死
1009 | 治安
1010 | 符咒
1011 | 祸患
1012 | 瘤
1013 | 灼伤
1014 | 淫亵
1015 | 罪行
1016 | 恐怖手段
1017 | 怀恶意
1018 | 官商勾结
1019 | 肮脏
1020 | 暴乱
1021 | 网警
1022 | 伪造
1023 | 瘾
1024 | 死前
1025 | 违法犯罪
1026 | 暴躁
1027 | 举报人
1028 | 汉奸
1029 | 罪恶
1030 | 徇私枉法
1031 | 魑魅魍魉
1032 | 奸情
1033 | 杀人者
1034 | 癌
1035 | 监狱
1036 | 威逼
1037 | 穷凶
1038 | 耍流氓
1039 | 流行病
1040 | 严重破坏
1041 | 霸道横行
1042 | 放毒
1043 | 青面獠牙
1044 | 冤死
1045 | 审判长
1046 | 相见恨晚
1047 | 解毒
1048 | 易爆
1049 | 劫掠
1050 | 戒严
1051 | 他妈的
1052 | 刺入
1053 | 行贿
1054 | 辐射
1055 | 兽行
1056 | 去你妈
1057 | 危害
1058 | 惶悚
1059 | 发怒
1060 | 卖国
1061 | 鱼肉百姓
1062 | 政变
1063 | 绑匪
1064 | 交巡警
1065 | 引起震惊
1066 | 射击
1067 | 恶性
1068 | 坑蒙拐骗
1069 | 盗窃
1070 | 半死不活
1071 | 叛国
1072 | 专制
1073 | 枪声
1074 | 噩运
1075 | 恶根
1076 | 刑事
1077 | 吸毒
1078 | 独裁者
1079 | 民事判决书
1080 | 被害者
1081 | 金融危机
1082 | 做人流
1083 | 救死扶伤
1084 | 下等
1085 | 毒性
1086 | 之死
1087 | 抗癌
1088 | 魔鬼身材
1089 | 肆虐
1090 | 恶行
1091 | 横死
1092 | 中伤
1093 | 乙肝病毒
1094 | 刁恶
1095 | 痞棍
1096 | 亡
1097 | 病毒
1098 | 不得好死
1099 | 赃官
1100 | 恨我
1101 | 杀菌剂
1102 | 职务犯罪
1103 | 阴险
1104 | 伪造证据
1105 | 吊祭
1106 | 精神疾病
1107 | 情仇
1108 | 干他
1109 | 意淫
1110 | 发火
1111 | 强暴
1112 | 死狗
1113 | 乌合之众
1114 | 啮噬
1115 | 忿世嫉俗
1116 | 越狱
1117 | 东窗事发
1118 | 奸夫
1119 | 深水炸弹
1120 | 杀人罪
1121 | 悲愤
1122 | 肿瘤医院
1123 | 娼妇
1124 | 堕落
1125 | 车祸
1126 | 噩耗
1127 | 耻辱
1128 | 警报声
1129 | 仇
1130 | 打人
1131 | 扫毒
1132 | 逼供
1133 | 证据确凿
1134 | 洗脑
1135 | 共同犯罪
1136 | 色狼
1137 | 殊死搏斗
1138 | 迷信
1139 | 淫靡
1140 | 娼妓
1141 | 被勒死
1142 | 山贼
1143 | 打击报复
1144 | 乱杀
1145 | 威胁
1146 | 寻死
1147 | 肇事
1148 | 屠杀
1149 | 严惩不怠
1150 | 监护人
1151 | 藏独
1152 | 警备区
1153 | 逃亡
1154 | 女流氓
1155 | 监控
1156 | 人身攻击
1157 | 哀家
1158 | 恶梦
1159 | 衣冠禽兽
1160 | 监管
1161 | 流氓
1162 | 土壤污染
1163 | 癌变
1164 | 炸裂
1165 | 冲突
1166 | 苟且
1167 | 不死
1168 | 肌瘤
1169 | 恩将仇报
1170 | 军政
1171 | 炸炸
1172 | 色欲
1173 | 骗人
1174 | 瘟神
1175 | 鱼肉乡民
1176 | 权钱交易
1177 | 精神病院
1178 | 色鬼
1179 | 定罪
1180 | 恶棍
1181 | 叛徒
1182 | 交警部门
1183 | 解咒
1184 | 阵亡
1185 | 凶手
1186 | 囚犯
1187 | 监察
1188 | 乐死
1189 | 发飙
1190 | 变态
1191 | 死等
1192 | 刑期
1193 | 干你
1194 | 杀虫
1195 | 立案监督
1196 | 去死
1197 | 下毒
1198 | 阎王
1199 | 重罪
1200 | 丧尽天良
1201 | 色魔
1202 | 镇压
1203 | 食道癌
1204 | 大恐慌
1205 | 盗匪
1206 | 决一死战
1207 | 杀
1208 | 到死
1209 | 危害性
1210 | 残酷
1211 | 执法
1212 | 恐怖统治
1213 | 魔怪
1214 | 过瘾
1215 | 消毒
1216 | 上吊
1217 | 杀了
1218 | 欲盖弥彰
1219 | 交警大队
1220 | 心黑手辣
1221 | 政治
1222 | 复仇
1223 | 暴徒
1224 | 非法拘禁
1225 | 魔怔
1226 | 巴结
1227 | 共犯
1228 | 恶意
1229 | 轰炸
1230 | 敢爱敢恨
1231 | 胁迫
1232 | 权色交易
1233 | 悲观
1234 | 死守
1235 | 炸丸子
1236 | 坠
1237 | 奸臣
1238 | 刑罚
1239 | 我靠
1240 | 爱死
1241 | 恐惧症
1242 | 行为不检
1243 | 糜烂
1244 | 薄命
1245 | 恐怖分子
1246 | 罪
1247 | 酷刑
1248 | 敢死队
1249 | 魔道
1250 | 仇敌
1251 | 严惩
1252 | 死死
1253 | 凌辱
1254 | 禽兽
1255 | 痴心妄想
1256 | 炸酱面
1257 | 空气污染指数
1258 | 拔刀相助
1259 | 贱男人
1260 | 分裂
1261 | 杀人
1262 | 审判员
1263 | 鸡八
1264 | 爆炸
1265 | 荒灾
1266 | 刀具
1267 | 快刀
1268 | 精神病人
1269 | 连环
1270 | 气急败坏
1271 | 叛逆
1272 | 无罪释放
1273 | 奸刁
1274 | 血染
1275 | 玷污
1276 | 解放路
1277 | 鬼子
1278 | 专横跋扈
1279 | 犯杀人罪
1280 | 泄密
1281 | 被告人
1282 | 侵袭
1283 | 追缉令
1284 | 作死
1285 | 鬼魂
1286 | 公安
1287 | 鬼魅
1288 | 间谍网
1289 | 气愤
1290 | 地狱火
1291 | 污染
1292 | 惨死
1293 | 凶狠
1294 | 淫逸
1295 | 案件
1296 | 血迹
1297 | 巢倾卵覆
1298 | 温柔一刀
1299 | 解放
1300 | 格杀无论
1301 | 死去
1302 | 气焰嚣张
1303 | 政治学院
1304 | 死老百姓
1305 | 拉帮结伙
1306 | 嗑药
1307 | 烧毁
1308 | 你去死
1309 | 乱砍
1310 | 五毒
1311 | 贱人
1312 | 混蛋
1313 | 火势
1314 | 你她妈
1315 | 杀价
1316 | 恐布
1317 | 邪鬼
1318 | 怒喝
1319 | 滴血
1320 | 淋巴结
1321 | 骂娘
1322 | 疾病
1323 | 晕死
1324 | 鼻咽癌
1325 | 奸男女
1326 | 执法局
1327 | 补偿款
1328 | 打架
1329 | 武器
1330 | 突发事件
1331 | 军阀
1332 | 杀千刀
1333 | 共匪
1334 | 恐布份子
1335 | 轮奸
1336 | 证据
1337 | 骂我
1338 | 诈骗
1339 | 怒斥
1340 | 土匪
1341 | 卑鄙
1342 | 判处死刑
1343 | 毒腺
1344 | 迷信引起
1345 | 粪青
1346 | 军队
1347 | 犯罪分子
1348 | 匪巢
1349 | 贿赂
1350 | 受贿
1351 | 拼死
1352 | 粪车
1353 | 混混儿
1354 | 杀机
1355 | 数罪
1356 | 收买
1357 | 噩兆
1358 | 至死
1359 | 邪魔
1360 | 忿怒
1361 | 短兵接战
1362 | 骂到
1363 | 交战
1364 | 死后
1365 | 忿
1366 | 恐怖袭击
1367 | 假币
1368 | 假钱
1369 | 假钞
1370 | 冒牌货
1371 | 投诉
1372 | 受理
1373 | 闹事
1374 | 通报
1375 | 追杀
1376 | 煤气
1377 | 煤气罐
1378 | 警方
1379 | 制服
1380 | 手持
1381 | 斧头
1382 | 铁管
1383 | 扬言
1384 | 水警
1385 | 警告
1386 | 置之不理
1387 | 砸伤
1388 | 受伤
1389 | 损失
1390 | 吸食
1391 | 冰毒
1392 | 擒获
1393 | 出狱
1394 | 谋划
1395 | 藏匿
1396 | 逃跑
1397 | 抢了
1398 | 搜寻
1399 | 事发
1400 | 观察哨
1401 | 警犬
1402 | 追踪
1403 | 追击
1404 | 走投无路
1405 | 抓获
1406 | 抢劫罪
1407 | 依法
1408 | 判处
1409 | 审讯
1410 | 供述
1411 | 罚单
1412 | 拆除
1413 | 严重影响
1414 | 擒
1415 | 盗
1416 | 贪念
1417 | 偷盗
1418 | 被盗
1419 | 派出所
1420 | 公安分局
1421 | 歪主意
1422 | 欠
1423 | 债务
1424 | 债主
1425 | 不义之财
1426 | 砸碎
1427 | 入狱
1428 | 前科
1429 | 一念之差
1430 | 不法分子
1431 | 失窃
1432 | 告破
1433 | 纠纷
1434 | 侦破
1435 | 女尸
1436 | 案情
1437 | 失踪
1438 | 线索
1439 | 安眠药
1440 | 涉嫌
1441 | 色情
1442 | 宣判
1443 | 犯罪案件
1444 | 严打
1445 | 审理
1446 | 查明
1447 | 预谋
1448 | 持刀
1449 | 抓获归案
1450 | 同案
1451 | 赃款
1452 | 赔偿
1453 | 被害人
1454 | 法院
1455 | 犯了
1456 | 刑律
1457 | 惩处
1458 | 处罚
1459 | 好逸恶劳
1460 | 不劳而获
1461 | 一拍即合
1462 | 追悔莫及
1463 | 悬崖勒马
1464 | 击毙
1465 | 击伤
1466 | 战斗
1467 | 公安民警
1468 | 搜查
1469 | 围捕
1470 | 作恶多端
1471 | 血案
1472 | 火力
1473 | 自杀式
1474 | 狗急跳墙
1475 | 砍刀
1476 | 圣战
1477 | 爆炸声
1478 | 枪
1479 | 境外
1480 | 侦查
1481 | 破获
1482 | 走私
1483 | 武器弹药
1484 | 涉枪
1485 | 涉赌
1486 | 枪支弹药
1487 | 大案
1488 | 赌场
1489 | 小混混
1490 | 绑架
1491 | 伤害罪
1492 | 人民法院
1493 | 缓刑
1494 | 寻衅
1495 | 滋事罪
1496 | 枪支
1497 | 子弹
1498 | 枪弹
1499 | 举报线索
1500 | 病残
1501 | 贫困
1502 | 遗嘱
1503 | 怪病
1504 | 昏迷不醒
1505 | 上当
1506 | 骗走
1507 | 被骗
1508 | 追查
1509 | 伪装成
1510 | 谎称
1511 | 骗取信任
1512 | 受骗
1513 | 骗取
1514 | 口角
1515 | 拳脚相加
1516 | 被打
1517 | 因涉嫌
1518 | 故意伤害
1519 | 提起公诉
1520 | 不见踪影
1521 | 不甘示弱
1522 | 警
1523 | 案发后
1524 | 公诉
1525 | 刑法
1526 | 抢救
1527 | 抢救无效
1528 | 卫生局
1529 | 司法局
1530 | 大出血
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/over:
--------------------------------------------------------------------------------
1 | 不为过
2 | 超
3 | 超额
4 | 超外差
5 | 超微结构
6 | 超物质
7 | 出头
8 | 多
9 | 浮
10 | 过
11 | 过度
12 | 过分
13 | 过火
14 | 过劲
15 | 过了头
16 | 过猛
17 | 过热
18 | 过甚
19 | 过头
20 | 过于
21 | 过逾
22 | 何止
23 | 何啻
24 | 开外
25 | 苦
26 | 老
27 | 偏
28 | 强
29 | 溢
30 | 忒
--------------------------------------------------------------------------------
/src/main/resources/emotion_dict/very:
--------------------------------------------------------------------------------
1 | 挺
2 | 怪
3 | 相当
4 | 十分
5 | 甚为
6 | 异常
7 | 深
8 | 蛮
9 | 够多
10 | 殊特
11 | 大大
12 | 何其
13 | 尤其
14 | 无比
15 | 不过
16 | 不少
17 | 不胜
18 | 惨
19 | 沉
20 | 沉沉
21 | 出奇
22 | 大为
23 | 多
24 | 多多
25 | 多加
26 | 多么
27 | 分外
28 | 格外
29 | 够瞧的
30 | 够戗
31 | 好
32 | 好不
33 | 何等
34 | 很
35 | 很是
36 | 坏
37 | 可
38 | 老
39 | 老大
40 | 良
41 | 颇
42 | 颇为
43 | 甚
44 | 实在
45 | 太
46 | 太甚
47 | 特
48 | 特别
49 | 尤
50 | 尤其
51 | 尤为
52 | 尤以
53 | 远
54 | 着实
55 | 曷
56 | 碜
--------------------------------------------------------------------------------
/src/main/resources/logback.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | %d{ISO8601} [%thread] %-5level %logger{36} [Line:%-3L] - %msg%n
8 |
9 |
10 |
11 | INFO
12 | ACCEPT
13 | DENY
14 |
15 |
16 |
17 |
19 | logs/negative-sentiment.log
20 |
21 | %d{ISO8601} [%thread] %-5level %logger{36} [Line:%-3L] - %msg%n
22 |
23 |
24 |
25 | INFO
26 |
27 |
28 | logs/negative-sentiment.log.%d{yyyy-MM-dd}.tar.gz
29 |
30 | 7
31 |
32 |
33 |
34 |
35 |
36 | FILE
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/main/resources/web-server.properties:
--------------------------------------------------------------------------------
1 | httpConn.maxTotal=10000
2 | httpConn.maxPerRoute=5000
3 |
4 | api.port=4567
5 |
--------------------------------------------------------------------------------
/src/test/java/zx/soft/negative/sentiment/core/NegativeClassifyTest.java:
--------------------------------------------------------------------------------
1 | package zx.soft.negative.sentiment.core;
2 |
3 | import static org.junit.Assert.assertEquals;
4 |
5 | import java.util.List;
6 |
7 | import org.junit.AfterClass;
8 | import org.junit.BeforeClass;
9 | import org.junit.Test;
10 |
11 | public class NegativeClassifyTest {
12 |
13 | private static NegativeClassify negativeClassify;
14 |
15 | @BeforeClass
16 | public static void prepare() {
17 | negativeClassify = new NegativeClassify();
18 | }
19 |
20 | @AfterClass
21 | public static void cleanup() {
22 | negativeClassify.cleanup();
23 | }
24 |
25 | @Test
26 | public void testGetSentences() {
27 | String text = "事实胜于雄辩。美方站不住脚的“搭便车论”实在荒唐...无异于,放大自己制造战乱却不思悔过的不义。。。。如果对别人的,,义举不服气,那就不要挑起战乱给别人“制造方便”嘛!";
28 | List sentences = negativeClassify.getSentences(text);
29 | assertEquals("事实胜于雄辩", sentences.get(0));
30 | assertEquals("美方站不住脚的“搭便车论”实在荒唐", sentences.get(1));
31 | assertEquals("无异于", sentences.get(2));
32 | assertEquals("放大自己制造战乱却不思悔过的不义", sentences.get(3));
33 | assertEquals("如果对别人的", sentences.get(4));
34 | assertEquals("义举不服气", sentences.get(5));
35 | assertEquals("那就不要挑起战乱给别人“制造方便”嘛!", sentences.get(6));
36 | }
37 |
38 | @Test
39 | public void testGetTextScore() {
40 | String text = "四川在线—绵阳频道讯 (周兰兰 记者 付江)8月7日,绵阳涪城区法院对5名“90后”被告人犯抢劫罪一案进行了公开宣判。"
41 | + "5名被告人分别被处以有期徒刑10至13年,并处罚金1万元至1.5万元不等,剥夺政治权利1至2年。该案的处理秉承了该院对于刑事"
42 | + "暴力犯罪案件长期以来的严打高压态势。经审理查明,被告人小平、小涛、小春、小虎、小洋5人经事先预谋,在2013年12月24日"
43 | + "至2014年1月1日不到10天的时间内,驾驶一辆红色“英伦”轿车,先后7次在绵阳城区、江油、三台、成都等地采取蒙面、持刀拦路"
44 | + "、语言威胁、搜身、殴打等方式,抢劫过路行人手机、钱包等贵重物品。2014年1月10日,被告人小平、小涛被公安机关抓获归案"
45 | + ",小涛在被公安机关抓获后协助公安机关抓获同案被告人小虎、小春。2014年1月11日,被告人小洋被公安机关抓获归案。审理期"
46 | + "间,5被告亲属分别代被告人退赔赃款及赔偿款人民币各1万元。并与受害人之一雷某达成民事赔偿协议并已履行,取得被害人谅解"
47 | + "。法院认为,五名被告以非法占有为目的,采取暴力、胁迫方式,强行劫取公私财物,其行为触犯了国家刑律,均已构成抢劫罪,"
48 | + "且属“多次抢劫”。应依法惩处。被告人小涛协助公安机关抓获同案被告人,属立功,可以从轻或者减轻处罚。五名被告当庭自愿认"
49 | + "罪,且积极退赃款,并主动赔偿给被害人造成的损失,取得被害人谅解,可酌情从轻处罚。最终,依照《中华人民共和国刑法》第"
50 | + "二百六十三条“以暴力、胁迫或者其他方法抢劫公私财物的,处三年以上十年以下有期徒刑,并处罚金;有‘多次抢劫或者抢劫数额"
51 | + "巨大的’等情形之一的,处十年以上有期徒刑、无期徒刑或者死刑,并处罚金或者没收财产”之规定,法院作出前诉判决。据该案的"
52 | + "主审法官介绍,该案的5名被告文化程度都不高,均是小学文化,从小未受到良好的教育,加之好逸恶劳,梦想不劳而获,几个同龄"
53 | + "人一拍即合,才会犯下这样的罪行。不仅给受害人身心造成了严重伤害,也让自己的家人伤心、失望,庭审中,5名当事人都表示追"
54 | + "悔莫及。奉劝那些期望通过“特殊途径”致富的人及时悬崖勒马,勤劳致富方能长久。";
55 | assertEquals(82.75f, negativeClassify.getTextScore(text), 0.0f);
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/src/test/resources/adv-data:
--------------------------------------------------------------------------------
1 | {"type":"adv","text":"2014雪花勇闯天涯“挑战未登峰”选拔赛现正全国火热进行中,雪花啤酒邀您共赴征程。以“挑战未登峰”为主题的2014勇闯天涯活动,将要对从来无人登顶的山峰进行挑战性开拓性的攀登!勇闯从未止步,勇闯因你而非凡!征程即刻开启,活动详情可关注@雪花啤酒勇闯天涯。 |雪花勇闯天涯挑战未登峰邀您共赴征程!"}
--------------------------------------------------------------------------------
/src/test/resources/logback-test.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | %d{MMdd.HHmmss.SSS} [%-20t] [%-5p] [%-20c] [L:%-3L] - %m%n
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/test/resources/neg-data:
--------------------------------------------------------------------------------
1 | {"type":"neg","text":"综合消息,近日,湖南湘潭县妇幼保健院一产妇死亡,经媒体报道引发关注。据“央视新闻”消息,湘潭县卫生局称,胎儿出生后产妇出现呕吐呛咳,院方立即抢救,但产妇因羊水栓塞引发多器官功能衰竭,抢救无效死亡。目前湘潭县卫生局、司法局已介入调查。据此前媒体报道,10日上午11点,医生给张女士做了产前检查,胎位正常,由于胎儿较重,医生建议家属做剖腹产。随后,张女士被推进五楼的手术室。12点05分,手术室护士告诉家属,产妇顺利产下宝宝。半个小时后,护士通知守在手术室外的刘先生,称产妇出现大出血情况,刘先生说,1个小时后,护士又通知他,称出血情况没止住,要其赶紧去买止血药。下午5点左右,一名护士通知刘先生,称产妇大出血,现在必须切除子宫,需要签字。晚上9点,刘先生家人听到有人在议论,说产妇已经死了。情急之下的刘先生上前使劲拍打手术室的大门,这时,出来一个自称是代理院长的人,说产妇仍在抢救,有脉搏。刘先生只得在外继续焦急地等待。直到晚上11点,刘先生再也按捺不住,再次敲门,询问护士情况,可此时,手术室内没有任何人回答他,因为手术室的门被反锁,刘先生不得不撬开手术室的大门。可进去之后,刘先生看到的了让他难以置信的一幕:妻子赤身裸体躺在手术台上,满口鲜血,眼睛里还含着泪水,可却再也没有了呼吸。而本应该在抢救的医生和护士,却全体失踪了,房间里只有一些不明身份的男子在吃着槟榔,抽着烟。针对此事,湘潭县卫生局称,8月10日12点05分胎儿出生后,产妇出现呕吐呛咳,院方立即抢救,但产妇因羊水栓塞引发多器官功能衰竭,抢救无效于21点30分死亡。目前湘潭县卫生局、司法局已介入调查。"}
--------------------------------------------------------------------------------