情感分析是通过分析文本内容,判断这段文本表达的情感是正面的、负面的,还是中立的。今天,咱们就来学习如何借助Python里的NLTK库和jieba库,完成中文情感分析任务。

一、前期准备:安装必备库

在正式开始之前,得先把要用的工具准备好,也就是安装nltkjieba这两个库。要是你的电脑上还没有安装,打开命令行工具,输入下面这条命令就能搞定:

pip install nltk jieba 

安装好这两个库之后,如果还想使用NLTK的一些其他功能,还需要下载它的数据集。在Python环境里输入下面这些代码就行:

import nltk nltk.download('punkt') nltk.download('averaged_perceptron_tagger') 

二、数据筹备:准备分析素材

进行情感分析,得有数据才行。咱们需要准备一份包含中文文本的数据集,里面最好既有表达正面情感的文本,也有表达负面情感的文本。假设现在已经有了这样一份数据集,下面是示例数据:

positive_texts = ["这部电影非常好看,情节很吸引人。", "这部电影很棒,值得一看。"] negative_texts = ["这部电影很糟糕,浪费时间。", "这部电影不好看,情节拖沓。"] 

三、中文分词:拆解文本内容

中文文本和英文文本不太一样,英文单词之间有空格隔开,而中文句子是连续的汉字。所以在进行情感分析之前,我们得先把中文文本拆分成一个个的词语,这时候就要用到jieba库了。来看下面这段代码:

import jieba def chinese_tokenize(text): return jieba.cut(text) # 示例文本 text = "这部电影非常好看,情节很吸引人。" tokens = list(chinese_tokenize(text)) print(tokens) 

在这段代码里,定义了一个chinese_tokenize函数,它的作用就是对输入的中文文本进行分词。jieba.cut函数会返回一个可迭代的对象,我们用list函数把它转换成列表,这样就能更直观地看到分词结果了。

四、构建模型:打造情感分析器

接下来,就要用NLTK的Naive Bayes分类器来构建情感分析模型了。这部分主要有两个关键步骤。

(一)提取特征

from nltk.classify import NaiveBayesClassifier def extract_features(word_list): return dict([(word, True) for word in word_list]) 

这里定义了extract_features函数,它的作用是从分词后的词语列表里提取特征。简单来说,就是把每个词语都当作一个特征,并标记为True,最后返回一个包含这些特征的字典。

(二)加载数据并转换格式

positive_features = [(extract_features(list(chinese_tokenize(text))), 'Positive') for text in positive_texts] negative_features = [(extract_features(list(chinese_tokenize(text))), 'Negative') for text in negative_texts] features = positive_features + negative_features import random random.shuffle(features) threshold = int(0.8 * len(features)) train_set = features[:threshold] test_set = features[threshold:] 

这段代码的作用是把之前准备好的正面和负面文本数据,按照特定的格式进行转换。先分别对正面和负面文本进行分词、提取特征,然后把特征和对应的情感标签(“Positive”或“Negative”)组合在一起。接着,把正面和负面的特征数据合并起来,再随机打乱顺序。最后,按照80%的数据用于训练、20%的数据用于测试的比例,划分出训练集和测试集。

五、模型训练与测试:检验模型效果

现在,就要用划分好的训练集来训练Naive Bayes分类器了,训练完之后,再用测试集评估它的准确性:

classifier = NaiveBayesClassifier.train(train_set) accuracy = nltk.classify.util.accuracy(classifier, test_set) print("分类器的准确性:", accuracy) 

通过NaiveBayesClassifier.train方法,使用训练集对分类器进行训练。训练完成后,用nltk.classify.util.accuracy函数来计算分类器在测试集上的准确性,也就是分类正确的样本数占总样本数的比例。

六、模型应用:预测新文本情感

训练好模型之后,就可以用它来预测新文本的情感了。来看下面这段代码:

def predict_sentiment(text): tokens = list(chinese_tokenize(text)) features = extract_features(tokens) return classifier.classify(features) # 示例文本 text = "这部电影非常好看,情节很吸引人。" print("预测情绪:", predict_sentiment(text)) 

predict_sentiment函数里,先对输入的文本进行分词,然后提取特征,最后用训练好的分类器对这些特征进行分类,返回预测的情感标签。

七、完整代码示例

为了让大家看得更清楚,下面把前面的代码整合到一起,形成一个完整的示例:

import jieba import nltk from nltk.classify import NaiveBayesClassifier import random # 准备数据(示例) positive_texts = ["这部电影非常好看,情节很吸引人。", "这部电影很棒,值得一看。"] negative_texts = ["这部电影很糟糕,浪费时间。", "这部电影不好看,情节拖沓。"] def chinese_tokenize(text): return jieba.cut(text) def extract_features(word_list): return dict([(word, True) for word in word_list]) # 加载数据并转换格式 positive_features = [(extract_features(list(chinese_tokenize(text))), 'Positive') for text in positive_texts] negative_features = [(extract_features(list(chinese_tokenize(text))), 'Negative') for text in negative_texts] features = positive_features + negative_features random.shuffle(features) threshold = int(0.8 * len(features)) train_set = features[:threshold] test_set = features[threshold:] # 训练模型 classifier = NaiveBayesClassifier.train(train_set) accuracy = nltk.classify.util.accuracy(classifier, test_set) print("分类器的准确性:", accuracy) # 预测新文本的情感 def predict_sentiment(text): tokens = list(chinese_tokenize(text)) features = extract_features(tokens) return classifier.classify(features) text = "这部电影非常好看,情节很吸引人。" print("预测情绪:", predict_sentiment(text)) 

八、提升模型准确性的方法

如果对当前模型的准确性不太满意,还可以尝试下面这些方法来提高:

  • 增加数据量:数据集越大,模型能学习到的信息就越多,准确性也就可能越高。就好比人读书越多,知道的知识就越多,判断事情也就更准确。
  • 优化特征提取方法:除了之前用的简单方法,还可以试试词性标注、词向量等其他特征提取方法,说不定能让模型更好地理解文本。
  • 更换模型:除了Naive Bayes分类器,也可以试试支持向量机(SVM)、随机森林这些机器学习模型,不同的模型可能会有不同的效果。

掌握了这些内容,大家在实际项目里进行中文情感分析应该就轻松多了吧,还不快去试试!