要查看原文嗜历,請(qǐng)參看:原文地址
簡(jiǎn)介
自然語(yǔ)言處理是當(dāng)今十分熱門的數(shù)據(jù)科學(xué)研究項(xiàng)目谣蠢。情感分析則是自然語(yǔ)言處理中一個(gè)很常見的實(shí)踐诗舰。例如可以借助民意測(cè)試來(lái)構(gòu)建完整的市場(chǎng)策略蔓罚,該領(lǐng)域已經(jīng)極大的改變了當(dāng)前的商業(yè)運(yùn)行模式,所以每一個(gè)數(shù)據(jù)科學(xué)家都應(yīng)該熟悉該領(lǐng)域的內(nèi)容荠耽。
成千上萬(wàn)的文本數(shù)據(jù)可以在短時(shí)間內(nèi)分析出情感類型(甚至是其他的特征钩骇,包括命名實(shí)體,話題铝量,主題等等)伊履。相比而言,如果使用人工來(lái)做這件事情款违,那將消耗一個(gè)團(tuán)隊(duì)的人數(shù)小時(shí)的時(shí)間。
接下來(lái)群凶,我們將按照處理一般情感分析問(wèn)題的方法來(lái)開展我們的工作插爹。首先,我們需要預(yù)處理和清理Twitter的原始數(shù)據(jù)。然后赠尾,我們需要觀察清洗好的數(shù)據(jù)力穗,并依靠直觀感覺(jué)來(lái)做一些常識(shí)。之后气嫁,我們要量化特征当窗,并使用量化后的數(shù)據(jù)集來(lái)訓(xùn)練模型,最終實(shí)現(xiàn)標(biāo)記tweet的情感寸宵。
這可以說(shuō)是NLP中最有意思的挑戰(zhàn)了崖面,我實(shí)在有點(diǎn)迫不及待的跟你一起開始這次探索之旅!
內(nèi)容的小目錄
- 1.理解問(wèn)題
- 2.預(yù)處理和數(shù)據(jù)清洗
- 3.制造故事和可視化效果
- 4.從清洗好的推文中提取特征
- 5.訓(xùn)練模型:情感分析
- 6.下一步要做什么
1.理解問(wèn)題
在開始我們的工作之前梯影,讓我們?cè)賮?lái)看一遍問(wèn)題巫员,這對(duì)于確定我們的目標(biāo)是非常重要的。問(wèn)題是這樣的:
這項(xiàng)任務(wù)的目標(biāo)是檢測(cè)出tweets中的負(fù)面言論甲棍。簡(jiǎn)單起見简识,我們認(rèn)為包含負(fù)面言論的可以認(rèn)為是種族主義或者性別歧視相關(guān)的內(nèi)容。所以感猛,任務(wù)就轉(zhuǎn)化成了區(qū)分種族主義和性別歧視與其他的內(nèi)容的分類任務(wù)七扰。
在正式的情況下,給定的訓(xùn)練樣本應(yīng)該都已經(jīng)標(biāo)注好了陪白,標(biāo)簽‘1’表示種族主義/性別歧視颈走,標(biāo)簽‘0’表示不是種族主義/性別歧視。你的目標(biāo)就是在給定的測(cè)試集上預(yù)測(cè)標(biāo)簽拷泽。
注意:本實(shí)驗(yàn)的評(píng)測(cè)標(biāo)準(zhǔn)為F1-score
從我個(gè)人來(lái)說(shuō)疫鹊,負(fù)面言論,網(wǎng)絡(luò)暴力司致,社交網(wǎng)絡(luò)霸凌這些事情已經(jīng)成為了非常尖銳的問(wèn)題拆吆,能夠做一個(gè)分析系統(tǒng),去檢測(cè)這些內(nèi)容將會(huì)大大的發(fā)揮作用脂矫,肅清網(wǎng)絡(luò)空間枣耀,清除網(wǎng)絡(luò)暴力,還給網(wǎng)絡(luò)一片凈土庭再。這也是我樂(lè)于接受這個(gè)任務(wù)的原因±剔龋現(xiàn)在就讓我們來(lái)看看詳細(xì)的步驟該怎么做吧。
2.Tweets 預(yù)處理和數(shù)據(jù)清洗
讓我們看一下下面兩張圖片拄轻,這是處于兩種不同狀態(tài)的辦公室颅围。一個(gè)凌亂不堪,一個(gè)清理的干凈整潔恨搓。
假如你要在這個(gè)辦公室里尋找某個(gè)文件院促,在那個(gè)環(huán)境下你更容易找到筏养?當(dāng)然是后面那個(gè)干凈整潔的常拓,每一個(gè)物品都?xì)w置到了合適的位置。數(shù)據(jù)清洗跟這個(gè)過(guò)程十分相似。如果數(shù)據(jù)能夠被規(guī)整成結(jié)構(gòu)化的格式慕蔚,那從中找到正確的信息將輕而易舉。
預(yù)處理數(shù)據(jù)是個(gè)必要的步驟,這是為了數(shù)據(jù)挖掘做準(zhǔn)備鸠匀。這會(huì)讓提取信息和機(jī)器學(xué)習(xí)算法的處理變得簡(jiǎn)單。如果跳過(guò)這一步,那么很大概率你會(huì)碰上充滿噪聲和偏差的數(shù)據(jù)集青瀑。這一步的目的就是把那些噪聲信息剔除掉帘饶,因?yàn)樵肼曅畔?duì)于情感分析沒(méi)有什么貢獻(xiàn)搭儒,比如那些標(biāo)點(diǎn)符號(hào)茴扁,特殊字符毁习,數(shù)字稍浆,以及對(duì)文本的權(quán)重貢獻(xiàn)很低的內(nèi)容嫁艇。
在后續(xù)的步驟中益楼,我們會(huì)從數(shù)據(jù)集中提取數(shù)字特征。這個(gè)特征空間是使用數(shù)據(jù)集中所有不重復(fù)的單詞構(gòu)建的。所以如果我們對(duì)數(shù)據(jù)預(yù)處理做得好萨惑,那之后我們也會(huì)獲得一個(gè)品質(zhì)更好的特征空間捐康。
首先,讓我們讀出數(shù)據(jù)庸蔼,并加載必要的依賴庫(kù)解总。你可以在下面的地址下載數(shù)據(jù)集:數(shù)據(jù)集下載地址
import re
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import string
import nltk
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
%matplotlib inline
train = pd.read_csv('train_E6oV3lV.csv')
test = pd.read_csv('test_tweets_anuFYb8.csv')
讓我們來(lái)看下數(shù)據(jù)
train.head()
可以看到,數(shù)據(jù)包含三列姐仅,id,label和tweet.label是一個(gè)二進(jìn)制數(shù)值花枫,tweet包含了我們需要清理的評(píng)論內(nèi)容刻盐。
看了頭部數(shù)據(jù)之后,我們大概可以開始清理數(shù)據(jù)了劳翰,清理大概可以從下面幾個(gè)方面入手:
- 由于隱私保護(hù)的問(wèn)題敦锌,Twitter的用戶名已經(jīng)被隱去,取而代之的是‘@user’佳簸。 這個(gè)標(biāo)簽沒(méi)有任何實(shí)際意義乙墙。
- 我們也考慮去掉標(biāo)點(diǎn)符號(hào),數(shù)字甚至特殊字符生均,他們也對(duì)區(qū)分不同的評(píng)論起不到任何作用听想。
- 大多數(shù)太短的詞起不到什么作用,比如‘pdx’马胧,‘his’汉买,‘a(chǎn)ll’。所以我們也把這些詞去掉佩脊。
- 執(zhí)行完上述三步之后蛙粘,我們就可以把每一條評(píng)論切分成獨(dú)立的單詞或者符號(hào)了,這在所有NLP任務(wù)中都是必須的一步邻吞。
- 在第四個(gè)數(shù)據(jù)中组题,有一個(gè)單詞‘love’.與此同時(shí),在余下的語(yǔ)料中我們可能會(huì)有更多的單詞抱冷,例如loves崔列,loving,lovable等等旺遮。這些詞其實(shí)都是一個(gè)詞赵讯。如果我們能把這些詞都?xì)w到它們的根源上,也就是都轉(zhuǎn)換成love耿眉,那么我們就可以大大降低不同單詞的數(shù)量边翼,而不會(huì)損失太多信息。
A)移除Twitter標(biāo)識(shí)@user
如上所述鸣剪,這些評(píng)論文本包含很多Twitter標(biāo)記组底,這些都是Twitter上面的用戶信息。我們需要把這些內(nèi)容刪掉筐骇,他們對(duì)于情感分析沒(méi)有什么幫助债鸡。
方便起見,先把訓(xùn)練集和測(cè)試集合起來(lái)铛纬。避免在訓(xùn)練集和測(cè)試集上重復(fù)操作的麻煩厌均。
combi = train.append(test, ignore_index=True)
下面是一個(gè)自定義的方法,用于正則匹配刪除文本中不想要的內(nèi)容告唆。它需要兩個(gè)參數(shù)棺弊,一個(gè)是原始文本晶密,一個(gè)是正則規(guī)則。這個(gè)方法的返回值是原始字符串清除匹配內(nèi)容后剩下的字符模她。在我們的實(shí)驗(yàn)中稻艰,我們將使用這個(gè)方法來(lái)去除@user標(biāo)記
def remove_pattern(input_txt, pattern):
r = re.findall(pattern, input_txt)
for i in r:
input_txt = re.sub(i, '', input_txt)
return input_txt
現(xiàn)在,我們新建一列tidy_tweet ,用于存放處理后的內(nèi)容侈净。就是上面說(shuō)的去掉Twitter標(biāo)記的內(nèi)容连锯。
# remove twitter handles (@user)
combi['tidy_tweet'] = np.vectorize(remove_pattern)(combi['tweet'], "@[\w]*")
B)去除標(biāo)點(diǎn)符號(hào),數(shù)字和特殊字符
這些字符都是沒(méi)有意義的用狱。跟上面的操作一樣,我們把這些字符也都剔除掉拼弃。
使用替換方法夏伊,去掉這些非字母內(nèi)容
# remove special characters, numbers, punctuations
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
C) 移除短單詞
這里要注意到底多長(zhǎng)的單詞應(yīng)該移除掉。我的選擇是小于等于三的都去掉吻氧。例如hmm溺忧,oh這樣的都沒(méi)啥用,刪掉這些內(nèi)容好一些
combi['tidy_tweet'] = combi['tidy_tweet'].apply(lambda x: ' '.join([w for w in x.split() if len(w)>3]))
我們?cè)賮?lái)看一下數(shù)據(jù)集的頭幾行
combi.head()
此時(shí)盯孙,清洗前后的數(shù)據(jù)對(duì)比已經(jīng)非常明顯了鲁森。重要的單詞被留了下來(lái),噪聲內(nèi)容被剔除了振惰。
D)符號(hào)化
下面我們要把清洗后的數(shù)據(jù)集符號(hào)化歌溉。符號(hào)指的是一個(gè)個(gè)的單詞,符號(hào)化的過(guò)程就是把字符串切分成符號(hào)的過(guò)程骑晶。
tokenized_tweet = combi['tidy_tweet'].apply(lambda x: x.split())
tokenized_tweet.head()
E)提取詞干
提取詞干說(shuō)的是基于規(guī)則從單詞中去除后綴的過(guò)程痛垛。例如,play桶蛔,player匙头,played,plays仔雷,playing都是play的變種蹂析。
from nltk.stem.porter import *
stemmer = PorterStemmer()
tokenized_tweet = tokenized_tweet.apply(lambda x: [stemmer.stem(i) for i in x]) # stemming
tokenized_tweet.head()
現(xiàn)在,我們把這些符號(hào)重新拼回去碟婆。使用nltk的MosesDetokenizer方法很容易做到电抚。
from nltk.tokenize.moses import MosesDetokenizer
detokenizer = MosesDetokenizer()
for i in range(len(tokenized_tweet)):
tokenized_tweet[i] = detokenizer.detokenize(tokenized_tweet[i], return_str=True)
combi['tidy_tweet'] = tokenized_tweet
3.制造故事和可視化效果
在這一小節(jié),我們要深入了解數(shù)據(jù)脑融。不論是文本數(shù)據(jù)還是其他數(shù)據(jù)喻频,探索并進(jìn)行數(shù)據(jù)可視化都是一個(gè)快速深入了解的必要手段。不必局限于本教程所述的幾種方式肘迎,你可以放開手腳嘗試更多的方法甥温。
開始探索之前锻煌,我們先來(lái)思考幾個(gè)關(guān)于數(shù)據(jù)方面的問(wèn)題:
- 數(shù)據(jù)集中最常見的單詞有哪些?
- 數(shù)據(jù)集上表述正面和負(fù)面言論的常見詞匯有哪些姻蚓?
- 評(píng)論一般有多少主題標(biāo)簽宋梧?
- 我的數(shù)據(jù)集跟哪些趨勢(shì)相關(guān)?
- 哪些趨勢(shì)跟情緒相關(guān)狰挡?他們和情緒是吻合的嗎捂龄?
A)使用 詞云 來(lái)了解評(píng)論中最常用的詞匯
現(xiàn)在,我想了解一下定義的情感在給定的數(shù)據(jù)集上是如何分布的加叁。一種方法是畫出詞云來(lái)了解單詞分布倦沧。
詞云指的是一種用單詞繪制的圖像。出現(xiàn)頻率越高的詞在圖案中越大它匕,出現(xiàn)頻率越低的詞在圖案中越小展融。
下面就來(lái)繪制基于我們的數(shù)據(jù)的詞云圖像。
all_words = ' '.join([text for text in combi['tidy_tweet']])
from wordcloud import WordCloud
wordcloud = WordCloud(width=800, height=500, random_state=21, max_font_size=110).generate(all_words)
plt.figure(figsize=(10, 7))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis('off')
plt.show()
可以看到大部分詞匯都是正能量的或者中性的豫柬。happy和love是高頻詞匯告希。從這上面似乎看不出這些內(nèi)容跟種族歧視或者性別歧視有什么關(guān)系。所以烧给,我們應(yīng)該分開去畫詞云燕偶,分成是種族歧視/性別歧視或者不是兩種數(shù)據(jù)。
B)非種族歧視/性別歧視的數(shù)據(jù)
normal_words =' '.join([text for text in combi['tidy_tweet'][combi['label'] == 0]])
wordcloud = WordCloud(width=800, height=500, random_state=21, max_font_size=110).generate(normal_words)
plt.figure(figsize=(10, 7))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis('off')
plt.show()
可以看出础嫡,這個(gè)詞云上的詞基本都是正能量或者中性詞指么。happy,smile驰吓,love都是高頻詞涧尿。大多數(shù)高頻詞跟我們的分類是吻合的,都屬于積極向上的情感檬贰。如法炮制姑廉,我們將畫出負(fù)能量情感詞云。我們希望能看到那些負(fù)面的翁涤,種族歧視桥言,性別歧視相關(guān)的詞。
C)種族歧視/性別歧視數(shù)據(jù)
negative_words = ' '.join([text for text in combi['tidy_tweet'][combi['label'] == 1]])
wordcloud = WordCloud(width=800, height=500,
random_state=21, max_font_size=110).generate(negative_words)
plt.figure(figsize=(10, 7))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis('off')
plt.show()
可以明顯看到葵礼,圖上的詞基本都有負(fù)面含義号阿。看起來(lái)我們的數(shù)據(jù)集還不錯(cuò)鸳粉。下一步扔涧,我們將進(jìn)行分析這些Twitter數(shù)據(jù)上的主題標(biāo)簽。
D)理解主題標(biāo)簽/流行趨勢(shì)對(duì)于評(píng)論情感的影響
主題標(biāo)簽指的是Twitter中用來(lái)在一段時(shí)間內(nèi)標(biāo)注某些流行趨勢(shì)的詞語(yǔ)。我們需要對(duì)這些標(biāo)簽進(jìn)行檢測(cè)枯夜,看看他們是不是會(huì)對(duì)情感分析任務(wù)產(chǎn)生影響弯汰,是否能夠?qū)^(qū)分評(píng)論有幫助。
帶有#前綴的詞就是主題標(biāo)簽湖雹,例如咏闪,下面的情況:
這個(gè)例子似乎是帶有性別歧視的內(nèi)容,而主題標(biāo)簽看起來(lái)也有這個(gè)意思摔吏。
我們存下所有主題標(biāo)簽鸽嫂,并分成兩類,一類是非歧視內(nèi)容中的標(biāo)簽征讲,一類是帶有歧視內(nèi)容中的標(biāo)簽据某。
# function to collect hashtags
def hashtag_extract(x):
hashtags = []
# Loop over the words in the tweet
for i in x:
ht = re.findall(r"#(\w+)", i)
hashtags.append(ht)
return hashtags
# extracting hashtags from non racist/sexist tweets
HT_regular = hashtag_extract(combi['tidy_tweet'][combi['label'] == 0])
# extracting hashtags from racist/sexist tweets
HT_negative = hashtag_extract(combi['tidy_tweet'][combi['label'] == 1])
# unnesting list
HT_regular = sum(HT_regular,[])
HT_negative = sum(HT_negative,[])
現(xiàn)在,我們已經(jīng)準(zhǔn)備好了主題標(biāo)簽诗箍,可以把top n的標(biāo)簽畫出來(lái)哗脖。
先來(lái)看一下非歧視組的標(biāo)簽吧。
a = nltk.FreqDist(HT_regular)
d = pd.DataFrame({'Hashtag': list(a.keys()),
'Count': list(a.values())})
# selecting top 10 most frequent hashtags
d = d.nlargest(columns="Count", n = 10)
plt.figure(figsize=(16,5))
ax = sns.barplot(data=d, x= "Hashtag", y = "Count")
ax.set(ylabel = 'Count')
plt.show()
所有標(biāo)簽都是正向的扳还,這符合預(yù)期。現(xiàn)在再來(lái)畫另外一組橱夭,我們期望得到的都是負(fù)面的標(biāo)簽氨距。
b = nltk.FreqDist(HT_negative)
e = pd.DataFrame({'Hashtag': list(b.keys()), 'Count': list(b.values())})
# selecting top 10 most frequent hashtags
e = e.nlargest(columns="Count", n = 10)
plt.figure(figsize=(16,5))
ax = sns.barplot(data=e, x= "Hashtag", y = "Count")
ax.set(ylabel = 'Count')
plt.show()
正如我們所預(yù)料的,大部分詞都是負(fù)面的棘劣,只有少數(shù)屬于中性的俏让。所有,留下這些標(biāo)簽用于后續(xù)的計(jì)算是個(gè)好主意茬暇。下面首昔,我們將開始從符號(hào)化數(shù)據(jù)中提取標(biāo)簽。
4.從清洗后的推文中提取特征
要分析清洗后的數(shù)據(jù)糙俗,就要把它們轉(zhuǎn)換成特征勒奇。根據(jù)用途來(lái)說(shuō),文本特征可以使用很多種算法來(lái)轉(zhuǎn)換巧骚。比如詞袋模型(Bag-Of-Words)赊颠,TF-IDF,word Embeddings之類的方法。
在本文中劈彪,我使用了Bag-Of-Words和TF-IDF兩個(gè)方法竣蹦。
詞袋特征
Bag-Of-Words是一種數(shù)字化表達(dá)特征的方式。假設(shè)有一個(gè)語(yǔ)料集合C沧奴,其中有D篇文章(d1痘括,d2,...dD),在C中有N個(gè)不重復(fù)的符號(hào)纲菌。那么這N個(gè)符號(hào)(即單詞)構(gòu)成一個(gè)列表挠日,那么詞袋模型的矩陣M的大小就是D*N.M中的每一行記錄了一篇文章D(i)中對(duì)應(yīng)符號(hào)的詞頻。
讓我們用一個(gè)簡(jiǎn)單的例子來(lái)加強(qiáng)理解驰后。假設(shè)我們只有兩篇文章
D1: He is a lazy boy. She is also lazy.
D2: Smith is a lazy person.
構(gòu)建包含所有去重單詞的list
= [‘He’,’She’,’lazy’,’boy’,’Smith’,’person’]
那么肆资,在這個(gè)語(yǔ)料C上,D=2灶芝,N=6
詞袋模型的矩陣M的大小就是2*6
現(xiàn)在郑原,這個(gè)矩陣就可以作為特征矩陣來(lái)構(gòu)建一個(gè)分類模型了。
使用sklearn的CountVectorizer方法可以輕松的構(gòu)建詞袋模型夜涕。
設(shè)置參數(shù)max_features = 1000 犯犁,只取詞頻前1000的詞。
from sklearn.feature_extraction.text import CountVectorizer
bow_vectorizer = CountVectorizer(max_df=0.90, min_df=2, max_features=1000, stop_words='english')
# bag-of-words feature matrix
bow = bow_vectorizer.fit_transform(combi['tidy_tweet'])
TF-IDF特征
這個(gè)方法也是基于詞頻的女器。但是它跟詞袋模型還有一些區(qū)別酸役,主要是它還考慮了一個(gè)單詞在整個(gè)語(yǔ)料庫(kù)上的情況而不是單一文章里的情況。
TF-IDF方法會(huì)對(duì)常用的單詞做懲罰驾胆,降低它們的權(quán)重涣澡。同時(shí)對(duì)于某些在整個(gè)數(shù)據(jù)集上出現(xiàn)較少,但是在部分文章中表現(xiàn)較好的詞給予了較高的權(quán)重丧诺。
來(lái)深入了解一下TF-IDF:
- TF = 單詞t在一個(gè)文檔中出現(xiàn)的次數(shù) / 文檔中全部單詞的數(shù)目
- IDF = log(N/n)入桂,N是全部文檔數(shù)目,n是單詞t出現(xiàn)的文檔數(shù)目
- TF-IDF = TF*IDF
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer(max_df=0.90, min_df=2, max_features=1000, stop_words='english')
# TF-IDF feature matrix
tfidf = tfidf_vectorizer.fit_transform(combi['tidy_tweet'])
5.訓(xùn)練模型:情感分析
到目前為止驳阎,所有預(yù)處理都已經(jīng)完成了抗愁。下面我們就開始基于這兩個(gè)特征集合開始訓(xùn)練預(yù)測(cè)模型。
我們使用邏輯回歸來(lái)構(gòu)建模型呵晚。邏輯回歸大意蜘腌,會(huì)擬合數(shù)據(jù)到一個(gè)邏輯方程式上,從而預(yù)測(cè)事件發(fā)生的概率饵隙。
下面這個(gè)方程就是邏輯回歸使用的式子:
要了解更多邏輯回歸的內(nèi)容撮珠,可以閱讀以下內(nèi)容:邏輯回歸文獻(xiàn)地址
注意:如果你想嘗試其他的機(jī)器學(xué)習(xí)算法,諸如隨機(jī)森林金矛,支持向量機(jī)劫瞳,XGBoot,下面這個(gè)地址可以提供一套成熟的課程來(lái)幫助你在情感分析上進(jìn)行實(shí)踐绷柒。
地址:https://trainings.analyticsvidhya.com.
A)使用詞袋模型特征集合構(gòu)建模型
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score
train_bow = bow[:31962,:]
test_bow = bow[31962:,:]
# splitting data into training and validation set
xtrain_bow, xvalid_bow, ytrain, yvalid = train_test_split(train_bow, train['label'], random_state=42, test_size=0.3)
lreg = LogisticRegression()
lreg.fit(xtrain_bow, ytrain) # training the model
prediction = lreg.predict_proba(xvalid_bow) # predicting on the validation set
prediction_int = prediction[:,1] >= 0.3 # if prediction is greater than or equal to 0.3 than 1 else 0
prediction_int = prediction_int.astype(np.int)
f1_score(yvalid, prediction_int) # calculating f1 score
輸出結(jié)果:0.53
訓(xùn)練出的邏輯回歸模型在驗(yàn)證集上給出的f1值為0.53≈居冢現(xiàn)在,我們使用這個(gè)模型來(lái)預(yù)測(cè)測(cè)試集數(shù)據(jù)废睦。
test_pred = lreg.predict_proba(test_bow)
test_pred_int = test_pred[:,1] >= 0.3
test_pred_int = test_pred_int.astype(np.int)
test['label'] = test_pred_int
submission = test[['id','label']]
submission.to_csv('sub_lreg_bow.csv', index=False) # writing data to a CSV file
在公開的排行榜上伺绽,f1值是0.567.現(xiàn)在我們?cè)賮?lái)訓(xùn)練基于TF-IDF特征集的模型,看看表現(xiàn)如何。
B)使用TF-IDF特征集合構(gòu)建模型
train_tfidf = tfidf[:31962,:]
test_tfidf = tfidf[31962:,:]
xtrain_tfidf = train_tfidf[ytrain.index]
xvalid_tfidf = train_tfidf[yvalid.index]
lreg.fit(xtrain_tfidf, ytrain)
prediction = lreg.predict_proba(xvalid_tfidf)
prediction_int = prediction[:,1] >= 0.3
prediction_int = prediction_int.astype(np.int)
f1_score(yvalid, prediction_int)
輸出結(jié)果:0.544
這個(gè)結(jié)果跟公開排行榜上的0.564更接近了奈应,看起來(lái)比詞袋模型有所提升澜掩。
6.下一步要做什么?
再打一遍廣告杖挣,如果你想更進(jìn)一步的研究情感分析肩榕,我們?yōu)槟銣?zhǔn)備了一系列的課程,可以在下面這個(gè)地址訪問(wèn):https://trainings.analyticsvidhya.com/.
這個(gè)課程包括了更多高級(jí)技術(shù)惩妇,比如特征提取的時(shí)候使用word2vec模型株汉,更多機(jī)器學(xué)習(xí)算法,模型調(diào)參等等內(nèi)容歌殃。
在課程中趁怔,你會(huì)學(xué)習(xí)到下面的內(nèi)容:(翻譯按:反反復(fù)復(fù)奥邸)
- 使用Embeddings(word2vec匈子,doc2vec)來(lái)創(chuàng)建更好的特征
- 實(shí)踐先進(jìn)的機(jī)器學(xué)習(xí)算法续室,比如SVM,RF波材,XGBoost
- 模型調(diào)參
- 自定義指標(biāo)
結(jié)語(yǔ)
在本文中股淡,我們學(xué)習(xí)了如何實(shí)際解決情感分析的問(wèn)題。我們對(duì)數(shù)據(jù)進(jìn)行預(yù)處理并進(jìn)行了探索廷区。然后我們使用詞袋模型揣非,TF-IDF方法提取特征。最后構(gòu)建了兩個(gè)分類模型躲因。
你覺(jué)得這篇文章有用嗎?你有什么好的技巧嗎忌傻?你在特征提取環(huán)節(jié)使用過(guò)什么其他方法嗎大脉?歡迎來(lái)討論和分享你的經(jīng)驗(yàn)在這個(gè)地址。水孩。镰矿。,我們很期待跟你進(jìn)行討論俘种。