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

更新於 發佈於 閱讀時間約 9 分鐘

先前上一篇是使用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

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

留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
147會員
265內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2024/06/29
情感分析是一種自然語言處理技術,用於自動識別和分析文本中的情感傾向,通常是正向、負向或中性。 我們可以使用 NLTK 來實現一個基於單純貝斯分類器的情感分析模型。
2024/06/29
情感分析是一種自然語言處理技術,用於自動識別和分析文本中的情感傾向,通常是正向、負向或中性。 我們可以使用 NLTK 來實現一個基於單純貝斯分類器的情感分析模型。
2024/06/29
本文介紹了流行的Python套件NLTK(Natural Language Toolkit)的主要特點、功能和在中文和英文語料上的應用。從安裝到實際應用,深入介紹了分詞、停用詞去除、詞性標註、命名實體識別等NLP任務的具體實現和步驟,幫助讀者理解和應用NLTK。
Thumbnail
2024/06/29
本文介紹了流行的Python套件NLTK(Natural Language Toolkit)的主要特點、功能和在中文和英文語料上的應用。從安裝到實際應用,深入介紹了分詞、停用詞去除、詞性標註、命名實體識別等NLP任務的具體實現和步驟,幫助讀者理解和應用NLTK。
Thumbnail
2024/06/22
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
2024/06/22
本文利用pyqt5,使用pyttsx3將QLineEdit(單行輸入框)的字串,轉成語音呈現出來。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
失戀這條路只能一個人走完。但只要你是愛電影的人、拍電影的人,都可以很幸運地,被這門藝術接住。看看銀幕上的故事,或用攝影機寫下自己的故事,陪你度過那段波濤,讓悲傷不會停留在悲傷,而是通往更認識自己。
Thumbnail
失戀這條路只能一個人走完。但只要你是愛電影的人、拍電影的人,都可以很幸運地,被這門藝術接住。看看銀幕上的故事,或用攝影機寫下自己的故事,陪你度過那段波濤,讓悲傷不會停留在悲傷,而是通往更認識自己。
Thumbnail
我從一開始看到電影的造型 就深深的被吸引 (畢竟我是個天金有相位的人XD 但是太忙沒有到電影院看 直到最近朋友和我討論到這部電影 我才把它看完了(我真的滿不能看手術或血腥的戲) 看完我有幾個感受和想法 *哲學使我們變得更好,還是讓我們更困惑? *
Thumbnail
我從一開始看到電影的造型 就深深的被吸引 (畢竟我是個天金有相位的人XD 但是太忙沒有到電影院看 直到最近朋友和我討論到這部電影 我才把它看完了(我真的滿不能看手術或血腥的戲) 看完我有幾個感受和想法 *哲學使我們變得更好,還是讓我們更困惑? *
Thumbnail
「性和愛能分開嗎?」是老生常談,本片則能滿足所需的新鮮感。訂閱「航電影的海」沙龍,即可獲得完整版影評及每月選片等獨家文章。
Thumbnail
「性和愛能分開嗎?」是老生常談,本片則能滿足所需的新鮮感。訂閱「航電影的海」沙龍,即可獲得完整版影評及每月選片等獨家文章。
Thumbnail
在飛機上看到這部電影,殊不知差點在飛機上飆淚QQ
Thumbnail
在飛機上看到這部電影,殊不知差點在飛機上飆淚QQ
Thumbnail
!!劇情暴雷!! 記錄個人心得及想法 我不太會寫什麼深度心得文,希望大家輕鬆看看哈哈 會去看這部電影的契機是因為網路上偶然瞥見這部電影很好評、很感人,第一印象還覺得畫風不太會是我喜歡的風格,頂多劇情好入口吧?所以放鬆地去看了,因為我完全沒查資料做功課,哇塞~電影開始播放之後我完全不知道到這是
Thumbnail
!!劇情暴雷!! 記錄個人心得及想法 我不太會寫什麼深度心得文,希望大家輕鬆看看哈哈 會去看這部電影的契機是因為網路上偶然瞥見這部電影很好評、很感人,第一印象還覺得畫風不太會是我喜歡的風格,頂多劇情好入口吧?所以放鬆地去看了,因為我完全沒查資料做功課,哇塞~電影開始播放之後我完全不知道到這是
Thumbnail
每個人都會找到,願意真心關心你,也能讓你放心地展示弱點的人
Thumbnail
每個人都會找到,願意真心關心你,也能讓你放心地展示弱點的人
Thumbnail
標籤:電影 評分:⭐️⭐️⭐️
Thumbnail
標籤:電影 評分:⭐️⭐️⭐️
Thumbnail
2023結束,順應每年的習慣來盤點一下去年看到的好看電影。懸疑的、溫暖的、荒謬的、驚艷的,電影的魔法是:你永遠能在其中看到一部分的自己。謝謝拍出好電影的人。好的電影永遠需要觀眾。配點酒,做點荒謬的夢,跟親近的人吵吵鬧鬧(或打一架),一年又過了。
Thumbnail
2023結束,順應每年的習慣來盤點一下去年看到的好看電影。懸疑的、溫暖的、荒謬的、驚艷的,電影的魔法是:你永遠能在其中看到一部分的自己。謝謝拍出好電影的人。好的電影永遠需要觀眾。配點酒,做點荒謬的夢,跟親近的人吵吵鬧鬧(或打一架),一年又過了。
Thumbnail
這部被歸類在電影,但其實很不像一部電影,當初是覺得片名有趣所以我點開來看,整部電影看完之後,覺得算普通沒有讓我腦袋大爆炸的感覺,但有幾個觀念其實還算有趣,蠻喜歡裡面的一句話「這是社群媒體的人類精華片段」。
Thumbnail
這部被歸類在電影,但其實很不像一部電影,當初是覺得片名有趣所以我點開來看,整部電影看完之後,覺得算普通沒有讓我腦袋大爆炸的感覺,但有幾個觀念其實還算有趣,蠻喜歡裡面的一句話「這是社群媒體的人類精華片段」。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News