自然语言处理——文本情感分析
文本情感分析:又称意见挖掘、倾向性分析等。简单而言,是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。互联网(如博客和论坛以及社会服务网络如大众点评)上产生了大量的用户参与的、对于诸如人物、事件、产品等有价值的评论信息。这些评论信息表达了人们的各种情感色彩和情感倾向性,如喜、怒、哀、乐和批评、赞扬等。基于此,潜在的用户就可以通过浏览这些主观色彩的评论来了解大众舆论对于某一事件或产品的看法。本文主要简述情感分析中的情感信息抽取,及文本粒度由大到小分别对情感分析方法进行对比和总结。
过程和环节:
1:收集数据集。采用用户评论和评分作为依据,通过样本数据训练分类来判断情感倾向
2:设计文本的表示模型。让机器读懂文本,是文本情感分析的基础首先要解决的是文本表示模型。向量表示文本,向量的特征是模型的最小单元。
3:选择文本的特征。中文分词(jieba,snownlp,thuLAC),将文本转换为词语。可以使用TF-IDF算法来抽取特征,并计算出特征值
4.选择分类模型:如 决策树,贝叶斯,人工神经网络,支持向量机等机器学习算法
示例代码:
import pandas as pd
from sklearn.cross_validation import train_test_split
import matplotlib.pyplot as plt
import os
#将文本转为小写,并且用空格对文本进行分割
from keras.preprocessing.text import text_to_word_sequence
import math
os.chdir("D:\python_workspace\sentimentClassification-master\data")
print("Loading data......")
#加载数据 训练集和测试集
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
# print(train.head(10))
# print(test.head(10))
print("#################")
#缺失值分析
print("train训练集的缺失值\n",train.isnull().sum())
print("test测试集的缺失值\n",test.isnull().sum())
#文本处理
train['comment_text_words']= train.comment_text.apply(text_to_word_sequence,filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n\'')
print("训练集中将文本转为小写,用空格分割\n",train.head())
test['comment_text_words'] = test.comment_text.apply(text_to_word_sequence, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n\'')
print("测试集将文本转为小写,用空格分割\n",test.head())
# 将预训练好的 embeddings 进行处理,返回几个有用的变量:
# words_to_index:将单词和编号进行映射
# index_to_words:将编号和单词进行映射,与 words_to_index 相反
# word_to_vec_map:将单词与它的 embedding 进行映射
def read_glove_vecs(glove_file):
with open(glove_file,"r",encoding="utf-8") as f:
#将单词保存到一个集合中
words = set()
#将单词与embedding 的映射保存到一个字典中
word_to_ver_map={}
for line in f:
line = line.strip().split()
#列表的第一个元素是单词
curr_word = line[0]
#将单词假如到集合中
words.add(curr_word)
#列表的其他元素是embedding 将单词与embedding进行映射,然后存入在字典中
word_to_ver_map[curr_word] =np.array(line[1:],dtype=np.float32)
#将单词进行编号,编号从1开始
i=1
word_to_index={}
index_to_words ={}
for w in sorted(words):
#创建映射,key是单词,value是编号
word_to_index[w]=i
#创建映射,key是编号,value是单词
index_to_words[i]=w
i=i+1
return word_to_index,index_to_words,word_to_ver_map
# glove.6B.50d.txt 是网上已经预训练好的 word embedding 文件
word_to_index, index_to_word, word_to_vec_map = read_glove_vecs('glove.6B.50d.txt')
print("word_to_index:\n",word_to_index)
print("index_to_word:\n",index_to_word)
print("word_to_ver_map:\n",word_to_vec_map)
def sentences_to_indices(X):
X_indices=[]
for word in X:
try:
X_indices.append(word_to_index[word])
except:
pass
return X_indices
test['comment_text_indexes'] = test.comment_text_words.apply(sentences_to_indices)
#文本长度分析
comment_text_max_words_length = np.max([np.max(train.comment_text_words.apply(lambda x: len(x)))
, np.max(test.comment_text_words.apply(lambda x: len(x)))])
print("最大文本长度是 "+str(comment_text_max_words_length))
# 查看商品名的长度的分布
train.comment_text_words.apply(lambda x: len(x)).hist()
#文本长度集中在0-400之间,所以我们把最大文本长度设置为200
MAX_COMMENT_TEXT_SEQ = 200
# 如果列表长度大于最大长度,那么将列表进行裁剪,如果列表长度小于最大长度,那么将列表补充到最大长度,并且默认填充0
from keras.preprocessing.sequence import pad_sequences
def get_keras_data(dataset):
X = {'comment_text': pad_sequences(dataset.comment_text_indexes, maxlen=MAX_COMMENT_TEXT_SEQ)}
return X
# 将训练集数据的文本编号列表进行填充,并且提取出来
X_train = get_keras_data(train)
# 将测试集数据的文本编号列表进行填充,并且提取出来
X_test = get_keras_data(test)
#将处理好的数据保存起来
import pickle
datafile = open('data.pkl', 'wb')
pickle.dump(X_train, datafile)
pickle.dump(X_test, datafile)
pickle.dump(word_to_index, datafile)
pickle.dump(index_to_word, datafile)
pickle.dump(word_to_vec_map, datafile)
datafile.close()
(原码链接:https://pan.baidu.com/s/17dsY8Jr7HE3PD8r1sXH57A 密码:nd7p)
欢迎各位大神交流,交流QQ群:688933850