原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动)。
论文在这里下载:基于情感词典的中文微博情感倾向性研究
(大家可以上知网自行下载)
本文采用的方法如下:
首先对单条微博进行文本预处理,并以标点符号为分割标志,将单条微博分割为n个句子,提取每个句子中的情感词 。以下两步的处理均以分句为处理单位。
第二步在情感词表中寻找情感词,以每个情感词为基准,向前依次寻找程度副词、否定词,并作相应分值计算。随后对分句中每个情感词的得分作求和运算。
第三步判断该句是否为感叹句,是否为反问句,以及是否存在表情符号。如果是,则分句在原有分值的基础上加上或减去对应的权值。
最后对该条微博的所有分句的分值进行累加,获得该条微博的最终得分。
代码如下:
首先文件结构图如下:
其中,degree_dict为程度词典,其中每个文件为不同的权值。
emotion_dict为情感词典,包括了积极情感词和消极情感词以及停用词。
文件一:文本预处理 textprocess.py
在里面封装了一些文本预处理的函数,方便调用。
# -*- coding: utf-8 -*-
__author__ = 'Bai Chenjia'
import jieba
import jieba.posseg as pseg
print "加载用户词典..."
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
jieba.load_userdict('C://Python27/Lib/site-packages/jieba/user_dict/pos_dict.txt')
jieba.load_userdict('C://Python27/Lib/site-packages/jieba/user_dict/neg_dict.txt')
# 分词,返回List
def segmentation(sentence):
seg_list = jieba.cut(sentence)
seg_result = []
for w in seg_list:
seg_result.append(w)
#print seg_result[:]
return seg_result
# 分词,词性标注,词和词性构成一个元组
def postagger(sentence):
pos_data = pseg.cut(sentence)
pos_list = []
for w in pos_data:
pos_list.append((w.word, w.flag))
#print pos_list[:]
return pos_list
# 句子切分
def cut_sentence(words):
words = words.decode('utf8')
start = 0
i = 0
token = 'meaningless'
sents = []
punt_list = ',.!?;~,。!?;~… '.decode('utf8')
#print "punc_list", punt_list
for word in words:
#print "word", word
if word not in punt_list: # 如果不是标点符号
#print "word1", word
i += 1
token = list(words[start:i+2]).pop()
#print "token:", token
elif word in punt_list and token in punt_list: # 处理省略号
#print "word2", word
i += 1
token = list(words[start:i+2]).pop()
#print "token:", token
else:
#print "word3", word
sents.append(words[start:i+1]) # 断句
start = i + 1
i += 1
if start < len(words): # 处理最后的部分
sents.append(words[start:])
return sents
def read_lines(filename):
fp = open(filename, 'r