欢迎访问宙启技术站
智能推送

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实现中文情感分析的方法,根据实际需求选择适合的方法进行使用。