[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
螃蟹_crab的沙龍
159會員
310內容數
本業是影像辨識軟體開發,閒暇時間進修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
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
失戀這條路只能一個人走完。但只要你是愛電影的人、拍電影的人,都可以很幸運地,被這門藝術接住。看看銀幕上的故事,或用攝影機寫下自己的故事,陪你度過那段波濤,讓悲傷不會停留在悲傷,而是通往更認識自己。
Thumbnail
失戀這條路只能一個人走完。但只要你是愛電影的人、拍電影的人,都可以很幸運地,被這門藝術接住。看看銀幕上的故事,或用攝影機寫下自己的故事,陪你度過那段波濤,讓悲傷不會停留在悲傷,而是通往更認識自己。
Thumbnail
我從一開始看到電影的造型 就深深的被吸引 (畢竟我是個天金有相位的人XD 但是太忙沒有到電影院看 直到最近朋友和我討論到這部電影 我才把它看完了(我真的滿不能看手術或血腥的戲) 看完我有幾個感受和想法 *哲學使我們變得更好,還是讓我們更困惑? *
Thumbnail
我從一開始看到電影的造型 就深深的被吸引 (畢竟我是個天金有相位的人XD 但是太忙沒有到電影院看 直到最近朋友和我討論到這部電影 我才把它看完了(我真的滿不能看手術或血腥的戲) 看完我有幾個感受和想法 *哲學使我們變得更好,還是讓我們更困惑? *
Thumbnail
「性和愛能分開嗎?」是老生常談,本片則能滿足所需的新鮮感。訂閱「航電影的海」沙龍,即可獲得完整版影評及每月選片等獨家文章。
Thumbnail
「性和愛能分開嗎?」是老生常談,本片則能滿足所需的新鮮感。訂閱「航電影的海」沙龍,即可獲得完整版影評及每月選片等獨家文章。
Thumbnail
在飛機上看到這部電影,殊不知差點在飛機上飆淚QQ
Thumbnail
在飛機上看到這部電影,殊不知差點在飛機上飆淚QQ
Thumbnail
!!劇情暴雷!! 記錄個人心得及想法 我不太會寫什麼深度心得文,希望大家輕鬆看看哈哈 會去看這部電影的契機是因為網路上偶然瞥見這部電影很好評、很感人,第一印象還覺得畫風不太會是我喜歡的風格,頂多劇情好入口吧?所以放鬆地去看了,因為我完全沒查資料做功課,哇塞~電影開始播放之後我完全不知道到這是
Thumbnail
!!劇情暴雷!! 記錄個人心得及想法 我不太會寫什麼深度心得文,希望大家輕鬆看看哈哈 會去看這部電影的契機是因為網路上偶然瞥見這部電影很好評、很感人,第一印象還覺得畫風不太會是我喜歡的風格,頂多劇情好入口吧?所以放鬆地去看了,因為我完全沒查資料做功課,哇塞~電影開始播放之後我完全不知道到這是
Thumbnail
每個人都會找到,願意真心關心你,也能讓你放心地展示弱點的人
Thumbnail
每個人都會找到,願意真心關心你,也能讓你放心地展示弱點的人
Thumbnail
標籤:電影 評分:⭐️⭐️⭐️
Thumbnail
標籤:電影 評分:⭐️⭐️⭐️
Thumbnail
2023結束,順應每年的習慣來盤點一下去年看到的好看電影。懸疑的、溫暖的、荒謬的、驚艷的,電影的魔法是:你永遠能在其中看到一部分的自己。謝謝拍出好電影的人。好的電影永遠需要觀眾。配點酒,做點荒謬的夢,跟親近的人吵吵鬧鬧(或打一架),一年又過了。
Thumbnail
2023結束,順應每年的習慣來盤點一下去年看到的好看電影。懸疑的、溫暖的、荒謬的、驚艷的,電影的魔法是:你永遠能在其中看到一部分的自己。謝謝拍出好電影的人。好的電影永遠需要觀眾。配點酒,做點荒謬的夢,跟親近的人吵吵鬧鬧(或打一架),一年又過了。
Thumbnail
這部被歸類在電影,但其實很不像一部電影,當初是覺得片名有趣所以我點開來看,整部電影看完之後,覺得算普通沒有讓我腦袋大爆炸的感覺,但有幾個觀念其實還算有趣,蠻喜歡裡面的一句話「這是社群媒體的人類精華片段」。
Thumbnail
這部被歸類在電影,但其實很不像一部電影,當初是覺得片名有趣所以我點開來看,整部電影看完之後,覺得算普通沒有讓我腦袋大爆炸的感覺,但有幾個觀念其實還算有趣,蠻喜歡裡面的一句話「這是社群媒體的人類精華片段」。
Thumbnail
電影是一種娛樂產業,但也是一門藝術作品,我自己也是很喜歡透過「觀影」來評論一部電影,電影觀後感其實是很主觀的東西,而我自己覺得一部電影的成敗,是我在看完這部電影後,能帶給我多少的省思,如果一部電影能夠反覆咀嚼,而且從中獲得許多不同於感官體驗的回饋,是我認為觀影的最大目的。
Thumbnail
電影是一種娛樂產業,但也是一門藝術作品,我自己也是很喜歡透過「觀影」來評論一部電影,電影觀後感其實是很主觀的東西,而我自己覺得一部電影的成敗,是我在看完這部電影後,能帶給我多少的省思,如果一部電影能夠反覆咀嚼,而且從中獲得許多不同於感官體驗的回饋,是我認為觀影的最大目的。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News