情感分析是一種自然語言處理技術,用於自動識別和分析文本中的情感傾向,通常是正向、負向或中性。
我們可以使用 NLTK 來實現一個基於單純貝斯分類器的情感分析模型。
首先,我們需要一些帶有情感標籤的文本數據集來訓練我們的分類器。
這裡我們使用 NLTK 內置的電影評論數據集 movie_reviews
,它包含了正面和負面的電影評論。
import nltk
from nltk.corpus import movie_reviews
# 準備訓練資料集
documents = [(list(movie_reviews.words(fileid)), category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
# 打亂資料順序以增加模型的泛化能力
import random
random.shuffle(documents)
# 準備特徵集
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = list(all_words.keys())[:2000] # 選取最常見的2000個單詞作為特徵
def document_features(document):
document_words = set(document)
features = {}
for word in word_features:
features['contains({})'.format(word)] = (word in document_words)
return features
featuresets = [(document_features(d), c) for (d,c) in documents]
train_set, test_set = featuresets[100:], featuresets[:100] # 分割訓練集和測試集
接下來,我們使用單純貝氏分類器(Naive Bayes classifier)來訓練情感分析模型。
from nltk.classify import NaiveBayesClassifier
# 訓練分類器
classifier = NaiveBayesClassifier.train(train_set)
# 查看模型在測試集上的準確率
print('Accuracy:', nltk.classify.accuracy(classifier, test_set))
Accuracy: 0.78
最後,我們可以使用訓練好的模型來對新的文本進行情感分析。
def sentiment_analysis(text):
tokens = nltk.word_tokenize(text)
features = document_features(tokens)
return classifier.classify(features)
# 測試情感分析模型
review1 = "This movie is great and fantastic!"
review2 = "I disliked this film. It was boring."
print("Review 1:", sentiment_analysis(review1))
print("Review 2:", sentiment_analysis(review2))
Review 1: neg
Review 2: neg
我們將使用 NLTK 提供的 pickle
模組來匯出訓練好的分類器模型。
import pickle
# 指定要保存模型的文件名
model_file = 'sentiment_classifier.pkl'
# 匯出模型
with open(model_file, 'wb') as f:
pickle.dump(classifier, f)
import pickle
# 加載模型
with open(model_file, 'rb') as f:
loaded_classifier = pickle.load(f)
# 使用加載的模型進行情感分析
def sentiment_analysis(text):
tokens = nltk.word_tokenize(text)
features = document_features(tokens)
return loaded_classifier.classify(features)
# 測試加載的情感分析模型
review1 = "This movie is great and fantastic!"
review2 = "I disliked this film. It was boring."
print("Review 1:", sentiment_analysis(review1))
print("Review 2:", sentiment_analysis(review2))