movie_reviews,
來訓練出情感分析模型,此篇文章介紹可以導入自己的訓練資料集來建立情感分析模組。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
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
這樣,你就可以根據自己的資料集訓練出自己的情感分析模型,並在需要時使用它。