實(shí)踐Twitter評(píng)論情感分析(數(shù)據(jù)集及代碼)

要查看原文嗜历,請(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


Twitter情感分析

從我個(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ù)情況

可以看到,數(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()
TOP 10 標(biāo)簽

所有標(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()
TOP 10 標(biāo)簽

正如我們所預(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)行討論俘种。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秤标,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宙刘,更是在濱河造成了極大的恐慌苍姜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悬包,死亡現(xiàn)場(chǎng)離奇詭異衙猪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門垫释,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丝格,“玉大人,你說(shuō)我怎么就攤上這事棵譬∠则颍” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵订咸,是天一觀的道長(zhǎng)曼尊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)算谈,這世上最難降的妖魔是什么涩禀? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮然眼,結(jié)果婚禮上艾船,老公的妹妹穿的比我還像新娘。我一直安慰自己高每,他們只是感情好屿岂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲸匿,像睡著了一般爷怀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上带欢,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天运授,我揣著相機(jī)與錄音,去河邊找鬼乔煞。 笑死吁朦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渡贾。 我是一名探鬼主播逗宜,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼空骚!你這毒婦竟也來(lái)了纺讲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囤屹,失蹤者是張志新(化名)和其女友劉穎熬甚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肋坚,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡则涯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年复局,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粟判。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亿昏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出档礁,到底是詐尸還是另有隱情角钩,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布呻澜,位于F島的核電站递礼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羹幸。R本人自食惡果不足惜脊髓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栅受。 院中可真熱鬧将硝,春花似錦、人聲如沸屏镊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)而芥。三九已至律罢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棍丐,已是汗流浹背误辑。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歌逢,地道東北人巾钉。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像趋翻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盒蟆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容