├── .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分死亡。目前湘潭县卫生局、司法局已介入调查。"} --------------------------------------------------------------------------------