2024-06-29|閱讀時間 ‧ 約 30 分鐘

[Python][自然語言]利用NLTK建立自己的情感分析模型

先前上一篇是使用NLT內置的電影評論數據集 movie_reviews,來訓練出情感分析模型,此篇文章介紹可以導入自己的訓練資料集來建立情感分析模組。

[Python][自然語言]NLTK 實現電影評論情感分析


所需套件

pip install pandas
pip install scikit-learn
pip install nltk

本機的套件版本

紀錄一下程式範例目前可成功使用的套件版本,因為有套件更新時可能語法就會跟著改變需要修正。

Python 3.10.12
scikit-learn 1.2.2
pandas 2.0.3
nltk 3.8.1


建立自己的情感分析模型,可以透過以下步驟來實現:

步驟一:準備自己的訓練資料集

首先,你需要準備帶有情感標籤的文本數據集。這些文本可以是來自於社交媒體、產品評論、新聞文章等,並且需要標記它們的情感類別,如正面、負面或中性。

例如,假設你有一個包含電影評論的 CSV 文件,每行包括評論文本和相應的情感類別(positive, negative, neutral):

text,sentiment
"This movie was fantastic!",positive
"I didn't like this film.",negative
"The plot was boring.",negative
"This film exceeded my expectations.",positive
"This movie is okay.",neutral

利用pandas來創立CSV文件

import pandas as pd

# 創建資料
data = {
'text': [
"This movie was fantastic!",
"I didn't like this film.",
"The plot was boring.",
"This film exceeded my expectations.",
"This movie is okay."
],
'sentiment': [
'positive',
'negative',
'negative',
'positive',
'neutral'
]
}

# 將資料轉換為 DataFrame
df = pd.DataFrame(data)

# 儲存成 CSV 檔案
df.to_csv('movie_reviews.csv', index=False)

print("CSV 檔案儲存完成。")


步驟二:讀取並處理資料

使用 Python 來讀取並處理 CSV 文件,準備用於訓練和測試的資料。

train_test_split 函數來自於 Scikit-Learn 套件(sklearn.model_selection),它的作用是將資料集分割成訓練集和測試集

train_test_split 需要的資料格式是list或 numpy 陣列。

import pandas as pd
from sklearn.model_selection import train_test_split

# 讀取 CSV 文件
df = pd.read_csv('your_dataset.csv')

# 處理文本和情感標籤
documents = [(text, sentiment) for text, sentiment in zip(df['text'], df['sentiment'])]

# 分割訓練集和測試集
train_documents, test_documents = train_test_split(documents, test_size=0.2, random_state=42)

# test_size=0.2 表示將資料集的 20% 分割為測試集,剩餘的 80% 作為訓練集
# random_state=42 用於設置隨機種子,保證每次運行結果一致



步驟三:特徵提取

使用 NLTK 或其他自然語言處理工具來提取文本特徵,例如詞袋模型、TF-IDF 向量等。這些特徵將作為機器學習模型的輸入。

import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import TfidfVectorizer

# 初始化停用詞集
stop_words = set(stopwords.words('english'))

# 定義特徵提取函數,這裡使用 TF-IDF 向量作為特徵
def extract_features(document):
words = word_tokenize(document.lower()) # 分詞並轉為小寫
words = [word for word in words if word.isalpha() and word not in stop_words] # 去除停用詞和非字母字符
return ' '.join(words)

# 提取特徵並轉換成 TF-IDF 向量
vectorizer = TfidfVectorizer(preprocessor=extract_features)
X_train = vectorizer.fit_transform([text for text, label in train_documents])
y_train = [label for text, label in train_documents]
X_test = vectorizer.transform([text for text, label in test_documents])
y_test = [label for text, label in test_documents]



步驟四:訓練機器學習模型

選擇適合的機器學習算法(如單純貝斯分類器、支持向量機、深度學習模型等),並使用準備好的特徵和標籤進行模型訓練。

from sklearn.naive_bayes import MultinomialNB

# 初始化並訓練分類器
classifier = MultinomialNB()
classifier.fit(X_train, y_train)

# 評估模型準確率
accuracy = classifier.score(X_test, y_test)
print('Accuracy:', accuracy)

輸出

評估準確率太低,因訓練資料數據過少,哈哈,因測試用只有五行。

Accuracy: 0.0



步驟五:部署模型

最後,使用訓練好的模型進行情感分析。你可以將模型保存為文件,並在需要時進行載入使用。

import pickle

# 指定要保存模型的文件名
model_file = 'your_sentiment_classifier.pkl'

# 儲存模型
with open(model_file, 'wb') as f:
pickle.dump(classifier, f)

# 載入模型
with open(model_file, 'rb') as f:
loaded_classifier = pickle.load(f)

# 使用載入的模型進行情感分析
def sentiment_analysis(text):
text_features = vectorizer.transform([extract_features(text)])
return loaded_classifier.predict(text_features)[0]

# 測試 情感分析模型
text1 = "I love this product!"
text2 = "This movie is terrible."

print("Text 1 sentiment:", sentiment_analysis(text1))
print("Text 2 sentiment:", sentiment_analysis(text2))

輸出

因為訓練資料過少,所以模型是沒有辦別能力的。

Text 1 sentiment: positive 
Text 2 sentiment: positive

這樣,你就可以根據自己的資料集訓練出自己的情感分析模型,並在需要時使用它。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.