Python实现中文情感分析的方法有哪些
发布时间:2023-12-24 05:23:00
Python实现中文情感分析的方法有多种,以下是其中几种常用方法及示例代码:
1. 情感词典方法(基于词典匹配):
- 情感词典是一个包含情感词汇及其情感极性(如正向、负向、中性)的词典。
- 通过对文本进行分词,然后匹配分词结果中的词语与情感词典。
- 计算匹配到的情感词的情感极性得分,得分越高表示情感越强烈。
- 可以基于这些得分来判断文本的情感倾向。
以下示例使用了哈工大的情感词典(https://pan.baidu.com/s/1hugrfRu)进行情感分析。
import jieba
# 载入情感词典
pos_dict = set() # 积极情感词典
neg_dict = set() # 消极情感词典
with open('positive.txt', 'r', encoding='utf-8') as f:
for line in f:
pos_dict.add(line.strip())
with open('negative.txt', 'r', encoding='utf-8') as f:
for line in f:
neg_dict.add(line.strip())
# 分词并匹配情感词典
def sentiment_score(text):
seg_text = jieba.lcut(text)
score = 0
for word in seg_text:
if word in pos_dict:
score += 1
elif word in neg_dict:
score -= 1
return score
# 测试
text = '这部电影真的太好看了!'
score = sentiment_score(text)
if score > 0:
print('文本情感为正向')
elif score < 0:
print('文本情感为负向')
else:
print('文本情感为中性')
2. 机器学习方法(基于有标签的训练数据):
- 使用有情感标签的训练数据集,对文本进行特征提取和向量化。
- 通过对训练数据进行模型训练,得到可以预测情感的模型。
- 使用训练好的模型对新文本进行情感预测。
以下示例使用了sklearn库中的朴素贝叶斯分类器进行情感分析。
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
# 读取有情感标签的训练数据
train_data = []
train_labels = []
with open('train_data.txt', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip().split('\t')
train_data.append(line[0])
train_labels.append(int(line[1]))
# 分词并向量化
seg_train_data = []
for text in train_data:
seg_text = jieba.lcut(text)
seg_train_data.append(' '.join(seg_text))
vectorizer = TfidfVectorizer()
train_data_vec = vectorizer.fit_transform(seg_train_data)
# 训练模型
classifier = MultinomialNB()
classifier.fit(train_data_vec, train_labels)
# 对新文本进行情感预测
def sentiment_predict(text):
seg_text = jieba.lcut(text)
text_vec = vectorizer.transform([' '.join(seg_text)])
label = classifier.predict(text_vec)[0]
return label
# 测试
text = '这部电影真的太好看了!'
label = sentiment_predict(text)
if label == 1:
print('文本情感为正向')
else:
print('文本情感为负向')
3. 深度学习方法(基于深度神经网络模型):
- 使用有情感标签的训练数据集,对文本进行预处理和向量化。
- 构建深度神经网络模型,如LSTM、CNN等,对情感进行预测。
- 训练深度神经网络模型,并使用训练好的模型对新文本进行情感预测。
以下示例使用了Keras库中的LSTM模型进行情感分析。
import jieba
import numpy as np
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense
# 读取有情感标签的训练数据
train_data = []
train_labels = []
with open('train_data.txt', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip().split('\t')
train_data.append(line[0])
train_labels.append(int(line[1]))
# 分词并向量化
max_len = 100 # 设置序列最大长度
train_data_vec = []
for text in train_data:
seg_text = jieba.lcut(text)
train_data_vec.append(seg_text)
tokenizer = Tokenizer()
tokenizer.fit_on_texts(train_data_vec) # 构建词典
train_data_seq = tokenizer.texts_to_sequences(train_data_vec) # 文本转向量
train_data_seq_pad = pad_sequences(train_data_seq, maxlen=max_len) # 序列填充
# 训练模型
vocab_size = len(tokenizer.word_index) + 1 # 词典大小
model = Sequential()
model.add(Embedding(vocab_size, 100, input_length=max_len))
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(train_data_seq_pad, np.array(train_labels), epochs=5, batch_size=32)
# 对新文本进行情感预测
def sentiment_predict(text):
seg_text = jieba.lcut(text)
text_seq = tokenizer.texts_to_sequences([seg_text])
text_seq_pad = pad_sequences(text_seq, maxlen=max_len)
label = model.predict(np.array(text_seq_pad))[0]
return int(label)
# 测试
text = '这部电影真的太好看了!'
label = sentiment_predict(text)
if label == 1:
print('文本情感为正向')
else:
print('文本情感为负向')
以上是几种常用的Python实现中文情感分析的方法,根据实际需求选择适合的方法进行使用。
