一、基礎(chǔ)知識
假設(shè)有一份文本數(shù)據(jù)如下,數(shù)據(jù)量很大,現(xiàn)在要對整個語料庫進行文本分析,category代表新聞種類,theme代表新聞主題,URL代表新聞鏈接地址,content代表新聞主題內(nèi)容

停用詞:在content這一列,在數(shù)據(jù)量很大的情況,很容易發(fā)現(xiàn)某些似乎與新聞本身意義不大的詞大量出現(xiàn),而我們就把這些在語料庫中大量出現(xiàn)但是又沒啥大用的詞叫做停用詞,在數(shù)據(jù)集鏈接中包含一份常見的停用詞,如下所示:

TF-IDF:用于關(guān)鍵詞提取。比如在一篇名叫《中國的蜜蜂養(yǎng)殖》這篇文章中進行詞頻(Term Frequency,縮寫為TF)統(tǒng)計出現(xiàn)次數(shù)最多的詞是“的”、“是”、“在”等這一類最常用的詞(停用詞,一般來說是要去掉的),在刪除掉停用詞過后我們發(fā)現(xiàn)“中國”、“蜜蜂”、“養(yǎng)殖”這三個詞的出現(xiàn)次數(shù)一樣多,那么這三個詞的重要性是一樣的嗎?一般來說"中國"是很常見的詞,相對而言,"蜜蜂"和"養(yǎng)殖"不那么常見。這時就需要引入一個叫做逆文檔頻率來進行衡量。"逆文檔頻率"(Inverse Document Frequency,縮寫為IDF)如果某個詞相比較于整個語料庫來說比較少見,但是它在這篇文章中多次出現(xiàn),那么它很可能就反映了這篇文章的特性,那它正是我們所需要的關(guān)鍵詞。
計算公式

TF-IDF = 詞頻(TF) * 逆文檔頻率(IDF)。還是在《中國的蜜蜂養(yǎng)殖》這篇文章中:假定該文長度為1000個詞,"中國"、"蜜蜂"、"養(yǎng)殖"各出現(xiàn)20次,則這三個詞的"詞頻"(TF)都為0.02。搜索Google發(fā)現(xiàn),包含"的"字的網(wǎng)頁共有250億張,假定這就是中文網(wǎng)頁總數(shù)(也就是語料庫)。包含"中國"的網(wǎng)頁共有62.3億張,包含"蜜蜂"的網(wǎng)頁為0.484億張,包含"養(yǎng)殖"的網(wǎng)頁為0.973億張。

可以看出蜜蜂和養(yǎng)殖的TF-IDF值比中國這個詞大,那么這篇文章的關(guān)鍵詞重要性依次為蜜蜂、養(yǎng)殖和中國。
文本相似度:假設(shè)有如下兩個句子A、B,我們該怎么判斷這兩個句子的相似度呢
句子A:我喜歡看電視,不喜歡看電影。
句子B:我不喜歡看電視,也不喜歡看電影。
先進行分詞來看一下。
句子A:我/喜歡/看/電視,不/喜歡/看/電影。
句子B:我/不/喜歡/看/電視,也/不/喜歡/看/電影。
可以得到整個語料庫:我,喜歡,看,電視,電影,不,也。
然后進行詞頻的統(tǒng)計
句子A:我 1,喜歡 2,看 2,電視 1,電影 1,不 1,也 0。
句子B:我 1,喜歡 2,看 2,電視 1,電影 1,不 2,也 1。
這樣就可以得出詞頻向量
句子A:[1, 2, 2, 1, 1, 1, 0]
句子B:[1, 2, 2, 1, 1, 2, 1]
相似度計算方法:最常用通過余弦進行計算


二、任務(wù)簡介與數(shù)據(jù)預(yù)處理
現(xiàn)在我們手里一份新聞數(shù)據(jù),數(shù)據(jù)里面包含新聞的內(nèi)容以及新聞的種類等等,我們要做的就是對新聞進行一個分類任務(wù),比如說汽車類時尚類等等。
數(shù)據(jù)集鏈接:https://pan.baidu.com/s/1fG_oagJT69bIgCZgasn_Ig 提取碼:yzd0
導(dǎo)入相關(guān)的python庫
import pandas as pd
import jieba # 如果沒有這個庫可能需要手動安裝
讀取數(shù)據(jù)集并刪除缺失的數(shù)據(jù)集(缺失的數(shù)據(jù)很少,所以可以刪除)
# read_table()讀取以‘/t’分割的文件到DataFrame
# 在實際使用中可以通過對sep參數(shù)的控制來對任何文本文件讀取
df_news = pd.read_table(``'./data/val.txt'``,names``=``[``'category'``,``'theme'``,``'URL'``,``'content'``],encoding``=``'utf-8'``)
df_news = df_news.dropna() # 刪除缺失數(shù)據(jù)
df_news.head()
content為新聞的主體內(nèi)容

查看數(shù)據(jù)集維度
df_news.shape
得到的結(jié)果
<pre>(5000, 4)</pre>
將新聞內(nèi)容轉(zhuǎn)換為list方便進行分詞并查看第1000條數(shù)據(jù)內(nèi)容
content = df_news.content.values.tolist() # 轉(zhuǎn)換為list 實際上是二維list
print``(content[``1000``])
內(nèi)容為:
<pre>阿里巴巴集團昨日宣布,將在集團管理層面設(shè)立首席數(shù)據(jù)官崗位(Chief?。模幔簦帷。希妫妫椋悖澹颍⒗锇桶停拢玻鹿?br>
司CEO陸兆禧將會出任上述職務(wù),向集團CEO馬云直接匯報。>菹ぃ和6月初的首席風(fēng)險官職務(wù)任命相同,首席數(shù)據(jù)官亦為阿
里巴巴集團在完成與雅虎股權(quán)談判,推進“one?。悖铮恚穑幔睿蹦繕?biāo)后,在集團決策層面新增的管理崗位。0⒗錛團昨日表示
,“變成一家真正意義上的數(shù)據(jù)公司”已是戰(zhàn)略共識。記者劉夏</pre>
下面使用python中的jieba庫進行分詞
content_S = []
for line in content:
# jieba分詞 精確模式。返回一個列表類型,建議使用
current_segment = jieba.lcut(line)
if len``(current_segment) > 1 and current_segment !``= '\r\n'``:
content_S.append(current_segment)
|
查看第1000條數(shù)據(jù)分詞后的內(nèi)容
content_S[``1000``]

轉(zhuǎn)為pandas支持的DataFrame格式
df_content = pd.DataFrame({``'content_S'``:content_S}) # 轉(zhuǎn)換為DataFrame
df_content.head()
分完詞后的結(jié)果為:

可以發(fā)現(xiàn)數(shù)據(jù)里面包含很多無用的詞匯,所以我們需要對這些數(shù)據(jù)進行清洗,就是刪除掉里面包含的停用詞
三、 刪除停用詞
讀取停用詞表
# 讀取停詞表
stopwords = pd.read_csv(``'./data/stopwords.txt'``,index_col``=``False``,sep``=``'\t'``,quoting``=``3``,names``=``[``'stopword'``],encoding``=``'utf-8'``)
stopwords.head()
結(jié)果為:

刪除語料庫中的停用詞,這里面的all_words是為了后面的詞云展示。
# 刪除新聞中的停用詞
def drop_stopwords(contents, stopwords):
contents_clean = [] # 刪除后的新聞
all_words = [] # 構(gòu)造詞云所用的數(shù)據(jù)
for line in contents:
line_clean = []
for word in line:
if word in stopwords:
continue
line_clean.append(word)
all_words.append(``str``(word))
contents_clean.append(line_clean)
return contents_clean, all_words
contents = df_content.content_S.values.tolist()
stopwords = stopwords.stopword.values.tolist()
# 得到刪除停用詞后的新聞以及詞云數(shù)據(jù)
contents_clean, all_words = drop_stopwords(contents, stopwords)
# df_content.content_S.isin(stopwords.stopword)
# df_content=df_content[~df_content.content_S.isin(stopwords.stopword)]
# df_content.head()
|
查看刪除停用詞后的新聞內(nèi)容
df_content = pd.DataFrame({``'contents_clean'``:contents_clean})
df_content.head()
|
從結(jié)果可以看出,這次的數(shù)據(jù)對比上面的數(shù)據(jù)來說質(zhì)量提高了很多。

查看一下出現(xiàn)的所有的詞匯,也就是刪除停用詞后的all_words。
df_all_words = pd.DataFrame({``'all_words'``:all_words})
df_all_words.head()
結(jié)果為:

統(tǒng)計all_words每個詞的詞頻,統(tǒng)計這個詞頻也是為了方便后面的詞云展示。
import numpy
# 分組統(tǒng)計
words_count = df_all_words.groupby(by``=``[``'all_words'``])[``'all_words'``].agg({``'count'``:numpy.size})
# 根據(jù)count排序
words_count = words_count.reset_index().sort_values(by``=``[``'count'``],ascending``=``False``)
words_count.head()
|
結(jié)果為:

四、詞云展示
導(dǎo)入wordcloud庫以及畫圖展示
from wordcloud import WordCloud # 詞云庫
import matplotlib.pyplot as plt
%``matplotlib inline
import matplotlib
matplotlib.rcParams[``'figure.figsize'``] = (``10.0``,``5.0``)
wordcloud = WordCloud(font_path``=``'./data/simhei.ttf'``,background_color``=``'white'``,max_font_size``=``80``)
word_frequence = {x[``0``]:x[``1``] for x in words_count.head(``100``).values} # 這里只顯示詞頻前100的詞匯
wordcloud = wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)
|
可視化結(jié)果為:

五、TF-IDF以及LDA主題模型
TF-IDF關(guān)鍵詞提取
import jieba.analyse
index = 2400
print``(df_news[``'content'``][index])
content_S_str = ''.join(content_S[index])
# 提取關(guān)鍵詞
print``(``" "``.join(jieba.analyse.extract_tags(content_S_str,topK``=``5``,withWeight = False``)))
可以得到第2400條數(shù)據(jù)以及關(guān)鍵詞
[[圖片上傳失敗...(image-f8426a-1580283113449)]](javascript:void(0); "復(fù)制代碼")
<pre>法國VS西班牙、里貝里VS哈維,北京時間6月24日凌晨一場的大戰(zhàn)舉世矚目,而這場勝利不僅僅關(guān)乎兩支頂級強隊的命運,同時也是他們背后
的球衣贊助商耐克和阿迪達斯之間的一次角逐。T諶胙”窘炫分薇的16支球隊之中,阿迪達斯和耐克的勢力范圍也是幾乎旗鼓相當(dāng):其中有5家球
衣由耐克提供,而阿迪達斯則贊助了6家,此外茵寶有3家,而剩下的兩家則由彪馬贊助。而當(dāng)比賽進行到現(xiàn)在,率先挺進四強的兩支球隊分別被耐
克支持的葡萄牙和阿迪達斯支持的德國占據(jù),而由于最后一場1/4決賽是茵寶(英格蘭)和彪馬(意大利)的對決,這也意味著明天凌晨西班牙同
法國這場阿迪達斯和耐克在1/4決賽的唯一一次直接交手將直接決定兩家體育巨頭在此次歐洲杯上的勝負(fù)。8據(jù)評估,在2012年足球商品的銷
售額能總共超過40億歐元,而單單是不足一個月的歐洲杯就有高達5億的銷售額,也就是說在歐洲杯期間將有700萬件球衣被搶購一空。根據(jù)市
場評估,兩大巨頭阿迪達斯和耐克的市場占有率也是并駕齊驅(qū),其中前者占據(jù)38%,而后者占據(jù)36%。體育權(quán)利顧問奧利弗-米歇爾在接受《隊
報》采訪時說:“歐洲杯是耐克通過法國翻身的一個絕佳機會!”C仔爾接著談到兩大贊助商的經(jīng)營策略:“競技體育的成功會燃起球衣購買的熱情,
不過即便是水平相當(dāng),不同國家之間的歐洲杯效應(yīng)卻存在不同。在德國就很出色,大約1/4的德國人通過電視觀看了比賽,而在西班牙效果則差很
多,由于民族主義高漲的加泰羅尼亞地區(qū)只關(guān)注巴薩和巴薩的球衣,他們對西班牙國家隊根本沒什么興趣。”因此盡管西班牙接連拿下歐洲杯和世界
杯,但是阿迪達斯只為西班牙足協(xié)支付每年2600萬的贊助費#相比之下盡管最近兩屆大賽表現(xiàn)糟糕法國足協(xié)將從耐克手中每年可以得到4000
萬歐元。米歇爾解釋道:“法國創(chuàng)紀(jì)錄的4000萬歐元贊助費得益于阿迪達斯和耐克競逐未來15年歐洲市場的競爭。耐克需要籠絡(luò)一個大國來打
贏這場歐洲大陸的戰(zhàn)爭,而盡管德國拿到的贊助費并不太高,但是他們卻顯然牢牢掌握在民族品牌阿迪達斯手中。從長期投資來看,耐克給法國的
贊助并不算過高。”
耐克 阿迪達斯 歐洲杯 球衣 西班牙</pre>
[[圖片上傳失敗...(image-45ca34-1580283113449)]](javascript:void(0); "復(fù)制代碼")
從最后一句話就可以大致得到這段文章的大致意思,那這些詞就是這段文章的關(guān)鍵詞。
LDA(Latent Dirichlet Allocation)是一種文檔主題生成模型,它是一種主題模型,它包含文章,主題和詞三個部分,它可以將文檔集中每篇文檔的主題以概率分布的形式給出,從而通過分析一些文檔抽取出它們的主題(分布)出來后,便可以根據(jù)主題(分布)進行主題聚類或文本分類。同時,它是一種典型的詞袋模型,即一篇文檔是由一組詞構(gòu)成,詞與詞之間沒有先后順序的關(guān)系。此外,一篇文檔可以包含多個主題,文檔中每一個詞都由其中的一個主題生成。LDA就是要干的事就是根據(jù)給定的一篇文檔,推測其主題分布。它是一個無監(jiān)督學(xué)習(xí),類似于聚類。
導(dǎo)入gensim庫,需要自己手動安裝
# pip install gensim
from gensim import corpora,models,similarities
import gensim # 自然語言處理庫
#http://radimrehurek.com/gensim/ # 需要用時可以自行查閱官方文檔
進行詞映射,相當(dāng)于一個大的字典,每一個詞匯進行一個映射。
# 做映射,相當(dāng)于詞袋 格式要求:list of list
dictionary = corpora.Dictionary(contents_clean) # 字典
corpus = [dictionary.doc2bow(sentence) for sentence in contents_clean] # 語料
|
進行LDA建模,將整個語料庫劃分為20個主題
# num_topics=20 類似Kmeans自己指定K值
lda = gensim.models.ldamodel.LdaModel(corpus``=``corpus,id2word``=``dictionary,num_topics``=``20``)
|
查看第1號主題的結(jié)果,然后選出這個主題中權(quán)重值最高的5個關(guān)鍵詞。
# 一號分類結(jié)果
print``(lda.print_topic(``1``, topn``=``5``))
|
分類后結(jié)果為:
<pre>0.008"說" + 0.007"男人" + 0.005"愛情" + 0.005"中" + 0.004*"離婚"</pre>
查看這20個主題的關(guān)鍵詞
for topic in lda.print_topics(num_topics``=``20``,num_words``=``5``):
print``(topic[``1``])
|
結(jié)果為:
[[圖片上傳失敗...(image-6d21e9-1580283113449)]](javascript:void(0); "復(fù)制代碼")
<pre>0.007"孩子" + 0.004"P" + 0.003"高校" + 0.003"a" + 0.003"說"
0.008"說" + 0.007"男人" + 0.005"愛情" + 0.005"中" + 0.004"離婚"
0.008"中" + 0.007"說" + 0.005"觀眾" + 0.005"a" + 0.004"男人"
0.020"男人" + 0.014"女人" + 0.008"說" + 0.005"中" + 0.005"孩子"
0.018"e" + 0.015"a" + 0.012"i" + 0.010"o" + 0.008"l"
0.021"電影" + 0.018"導(dǎo)演" + 0.010"影片" + 0.008"中" + 0.006"主演"
0.009"節(jié)目" + 0.007"中" + 0.006"說" + 0.004"主持人" + 0.004"吃"
0.006"學(xué)校" + 0.004"工作" + 0.004"學(xué)生" + 0.004"高考" + 0.004"中"
0.012"a" + 0.012"n" + 0.010"中" + 0.010"e" + 0.010"o"
0.008"中國" + 0.005"中" + 0.004"創(chuàng)作" + 0.004"西班牙" + 0.004"說"
0.013"官兵" + 0.007"部隊" + 0.006"武警" + 0.004"萬" + 0.003"中"
0.005"中" + 0.005"S" + 0.004"V" + 0.004"L" + 0.004"N"
0.010"M" + 0.005"P" + 0.005"張紹" + 0.005"I" + 0.004"S"
0.008"中" + 0.006"中國" + 0.006"觀眾" + 0.005"說" + 0.004"比賽"
0.005"萬" + 0.003"號" + 0.003"公司" + 0.002"T" + 0.002"壯陽"
0.007"S" + 0.006"號" + 0.004"萬" + 0.004"a" + 0.004"中"
0.004"中國" + 0.004"產(chǎn)品" + 0.003"歐洲杯" + 0.003"中" + 0.003"化妝水"
0.005"中" + 0.005"萬" + 0.004"排毒" + 0.003"紋身" + 0.003"號"
0.005"中" + 0.005"比賽" + 0.004"食物" + 0.003"香港" + 0.003"營養(yǎng)"
0.010"考生" + 0.008"中" + 0.004"發(fā)展" + 0.004"文化" + 0.003"中國"</pre>
[[圖片上傳失敗...(image-7c23de-1580283113449)]](javascript:void(0); "復(fù)制代碼")
六、使用貝葉斯進行分類
先將清洗好的數(shù)據(jù)轉(zhuǎn)換為pandas支持的DataFrame格式
df_train``=``pd.DataFrame({``'contents_clean'``:contents_clean,``'label'``:df_news[``'category'``]})
df_train.tail()
得到的結(jié)果為:

查看數(shù)據(jù)集所有類別
df_train.label.unique()
結(jié)果:
<pre>array(['汽車', '財經(jīng)', '科技', '健康', '體育', '教育', '文化', '軍事', '娛樂', '時尚'],
dtype=object)</pre>
使用pandas對類別進行映
label_mapping = {``"汽車"``: 1``, "財經(jīng)"``: 2``, "科技"``: 3``, "健康"``: 4``, "體育"``:``5``, "教育"``: 6``,``"文化"``: 7``,``"軍事"``: 8``,``"娛樂"``: 9``,``"時尚"``: 0``}
df_train[``'label'``] = df_train[``'label'``].``map``(label_mapping)
df_train.head()
|
得到的結(jié)果是

下面開始常規(guī)的機器學(xué)習(xí)套路進行分類,首先劃分訓(xùn)練集與測試集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df_train[``'contents_clean'``].values, df_train[``'label'``].values, random_state``=``1``)
查看訓(xùn)練集
#x_train = x_train.flatten()
x_train[``0``][``1``]
|
結(jié)果:
<pre>'上海'</pre>
訓(xùn)練集數(shù)據(jù)轉(zhuǎn)為字符串?dāng)?shù)據(jù),為了符合下面輸入數(shù)據(jù)的格式。
words = []
for line_index in range``(``len``(x_train)):
try``:
#x_train[line_index][word_index] = str(x_train[line_index][word_index])
words.append(``' '``.join(x_train[line_index]))
except``:
print``(line_index,word_index)
words[``0``]
|
得到的第0條數(shù)據(jù)
[[圖片上傳失敗...(image-e81138-1580283113447)]](javascript:void(0); "復(fù)制代碼")
<pre>'中新網(wǎng) 上海 日電 于俊 父親節(jié) 網(wǎng)絡(luò) 吃 一頓 電影 快餐 微 電影 爸 對不起 我愛你 定于 本月 父親節(jié) 當(dāng)天 各大 視頻 網(wǎng)站
首映 葜 譜 鞣 劍 保慈 障蚣 欽 囈 檣 埽 ⒌ 纈 埃 ǎ 停 椋 悖 潁 鎩 媯 椋 恚 稱 微型 電影 新 媒體 平臺 播放 狀態(tài)
短時 休閑 狀態(tài) 觀看 完整 策劃 系統(tǒng) 制作 體系 支持 顯示 較完整 故事情節(jié) 電影 微 超短 放映 微 周期 制作 天 數(shù)周 微
規(guī)模 投資 人民幣 幾千 數(shù)萬元 每部 內(nèi)容 融合 幽默 搞怪 時尚 潮流 人文 言情 公益 教育 商業(yè) 定制 主題 單獨 成篇 系列
成劇 唇 開播 微 電影 爸 對不起 我愛你 講述 一對 父子 觀念 缺少 溝通 導(dǎo)致 關(guān)系 父親 傳統(tǒng) 固執(zhí) 鐘情 傳統(tǒng) 生活 方式
兒子 新派 音樂 達 習(xí)慣 晚出 早 生活 性格 張揚 叛逆 兩種 截然不同 生活 方式 理念 差異 一場 父子 間 拉開序幕 子 失
手 打破 父親 心愛 物品 父親 趕出 家門 劇情 演繹 父親節(jié) 妹妹 哥哥 化解 父親 這場 矛盾 映逋壞 嚼 斫 狻 ⒍ 粵 ⒌ 槳
容 爭執(zhí) 退讓 傳統(tǒng) 尷尬 父子 尷尬 情 男人 表達 心中 那份 感恩 一杯 濾掛 咖啡 父親節(jié) 變得 溫馨 鎂 纈 繕 蝦 N 逄 煳
幕 傳播 迪歐 咖啡 聯(lián)合 出品 出品人 希望 觀摩 捫心自問 父親節(jié) 父親 記得 父親 生日 哪一天 父親 愛喝 跨出 家門 那一
刻 感覺 一顆 顫動 心 操勞 天下 兒女 父親節(jié) 大聲 喊出 父親 家人 愛 完'</pre>
[[圖片上傳失敗...(image-29c304-1580283113447)]](javascript:void(0); "復(fù)制代碼")
打印word的長度
print``(``len``(words))
|
word長度為
<pre>3750</pre>
使用一個小例子用sklearn將詞轉(zhuǎn)換為詞頻向量
from sklearn.feature_extraction.text import CountVectorizer
texts``=``[``'dog cat fish'``,``'dog cat cat'``,``'fish bird'``,``'bird'``] # 注意text格式
cv = CountVectorizer()
cv_fit = cv.fit_transform(texts)
print``(cv.get_feature_names())
print``(cv_fit.toarray())
print``(cv_fit.toarray().``sum``(axis``=``0``))
|
結(jié)果是
[[圖片上傳失敗...(image-35649a-1580283113447)]](javascript:void(0); "復(fù)制代碼")
<pre>['bird', 'cat', 'dog', 'fish']
[[0 1 1 1]
[0 2 1 0]
[1 0 0 1]
[1 0 0 0]]
[2 3 2 2]</pre>
[[圖片上傳失敗...(image-35bf8e-1580283113447)]](javascript:void(0); "復(fù)制代碼")
改變參數(shù)試一下,ngram_range表示1到4個詞進行組合,讓向量更加復(fù)雜
|
from sklearn.feature_extraction.text import CountVectorizer
texts``=``[``"dog cat fish"``,``"dog cat cat"``,``"fish bird"``, 'bird'``]
cv = CountVectorizer(ngram_range``=``(``1``,``4``))
cv_fit``=``cv.fit_transform(texts)
print``(cv.get_feature_names())
print``(cv_fit.toarray())
print``(cv_fit.toarray().``sum``(axis``=``0``))
|
得到的向量為:

現(xiàn)在使用sklearn對上面構(gòu)造的數(shù)據(jù)(也就是特定格式的數(shù)據(jù))轉(zhuǎn)換為詞頻向量
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(analyzer``=``'word'``, max_features``=``4000``, lowercase = False``)
vec.fit(words)
|
構(gòu)造的模型為
[[圖片上傳失敗...(image-2978ce-1580283113447)]](javascript:void(0); "復(fù)制代碼")
<pre>CountVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=False, max_df=1.0, max_features=4000, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=None,
strip_accents=None, token_pattern='(?u)\b\w\w+\b',
tokenizer=None, vocabulary=None)</pre>
[[圖片上傳失敗...(image-189410-1580283113447)]](javascript:void(0); "復(fù)制代碼")
然后使用貝葉斯算法完成結(jié)果分類,傳入的參數(shù)是剛才的詞頻向量
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vec.transform(words), y_train)
|
構(gòu)造的模型為
<pre>MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)</pre>
還是將數(shù)據(jù)轉(zhuǎn)換為字符串,使用測試集來進行測試
test_words = []
for line_index in range``(``len``(x_test)):
try``:
#x_train[line_index][word_index] = str(x_train[line_index][word_index])
test_words.append(``' '``.join(x_test[line_index]))
except``:
print (line_index,word_index)
test_words[``0``]
|
查看得到的測試集(也要符合輸入的格式)
[[圖片上傳失敗...(image-867212-1580283113447)]](javascript:void(0); "復(fù)制代碼")
<pre>'國家 公務(wù)員 考試 申論 應(yīng)用文 類 試題 實質(zhì) 一道 集 概括 分析 提出 解決問題 一體 綜合性 試題 說 一道 客觀
凝練 申發(fā) 論述 文章 題目 分析 歷年 國考 申論 真題 公文 類 試題 類型 多樣 包括 公文 類 事務(wù)性 文書 類 題
材 從題 干 作答 材料 內(nèi)容 整合 分析 無需 太 創(chuàng)造性 發(fā)揮 縱觀 歷年 申論 真題 作答 應(yīng)用文 類 試題 文種 格
式 作出 特別 重在 內(nèi)容 考查 行文 格式 考生 平常心 面對 應(yīng)用文 類 試題 準(zhǔn)確 把握 作答 領(lǐng)會 內(nèi)在 含義 把
握 題材 主旨 材料 結(jié)構(gòu) 輕松 應(yīng)對 應(yīng)用文 類 試題 R 弧 ⒆ 釩 鹽 展文 寫作 原則 T 材料 中來 應(yīng)用文 類 試
題 材料 總體 把握 客觀 考生 材料 中來 材料 中 把握 材料 準(zhǔn)確 理解 題材 主旨 T 政府 角度 作答 應(yīng)用文 類
試題 更應(yīng) 注重 政府 角度 觀點 政府 角度 出發(fā) 原則 表述 觀點 提出 解決 之策 考生 作答 站 政府 人員 角度
看待 提出 解決問題 T 文體 結(jié)構(gòu) 形式 考查 重點 文體 結(jié)構(gòu) 大部分 評分 關(guān)鍵點 解答 方法 薄 ⒆ ス 丶 詞
明 方向 作答 題目 題干 作答 作答 方向 作答 角度 關(guān)鍵 向?qū)?考生 仔細(xì)閱讀 題干 作答 抓住 關(guān)鍵詞 作答 方向
相關(guān) 要點 整理 作答 思路 年國考 地市級 真 題為 例 潦惺姓 府 宣傳 推進 近海 水域 污染 整治 工作 請 給定
資料 市政府 工作人員 身份 草擬 一份 宣傳 綱要 R 求 保對 宣傳 內(nèi)容 要點 提綱挈領(lǐng) 陳述 玻 體現(xiàn) 政府 精
神 全市 各界 關(guān)心 支持 污染 整治 工作 通俗易懂 超過 字 骯 丶 詞 近海 水域 污染 整治 工作 市政府 工作人
員 身份 宣傳 綱要 提綱挈領(lǐng) 陳述 體現(xiàn) 政府 精神 全市 各界 關(guān)心 支持 污染 整治 工作 通俗易懂 提示 歸結(jié)
作答 要點 包括 污染 情況 原因 解決 對策 作答 思路 情況 原因 對策 意義 邏輯 順序 安排 文章 結(jié)構(gòu) 病 ⒋
缶殖 齜 ⅲ 明 結(jié)構(gòu) 解答 應(yīng)用文 類 試題 考生 材料 整體 出發(fā) 大局 出發(fā) 高屋建瓴 把握 材料 主題 思想 事件
起因 解決 對策 閱讀文章 構(gòu)建 文章 結(jié)構(gòu) 直至 快速 解答 場 ⒗ 硭 乘悸 罰明 邏輯 應(yīng)用文 類 試題 嚴(yán)密 邏
輯思維 情況 原因 對策 意義 考生 作答 先 弄清楚 解答 思路 統(tǒng)籌安排 脈絡(luò) 清晰 邏輯 表達 內(nèi)容 表述 礎(chǔ)
把握 明 詳略 考生 仔細(xì)閱讀 分析 揣摩 應(yīng)用文 類 試題 內(nèi)容 答題 時要 詳略 得當(dāng) 主次 分明 安排 內(nèi)容 增加
文章 層次感 閱卷 老師 閱卷 時能 明白 清晰 一目了然 玻埃 保蹦旯 考 考試 申論 試卷 分為 省級 地市級 兩套
試卷 能力 大有 省級 申論 試題 考生 宏觀 角度看 注重 深度 廣度 考生 深謀遠(yuǎn)慮 地市級 試題 考生 微觀 視角
觀察 側(cè)重 考查 解決 能力 考生 貫徹執(zhí)行 作答 區(qū)別對待'</pre>
[[圖片上傳失敗...(image-688ea6-1580283113447)]](javascript:void(0); "復(fù)制代碼")
查看預(yù)測準(zhǔn)確率為
classifier.score(vec.transform(test_words), y_test)
|
準(zhǔn)確率為:
<pre>0.804</pre>
現(xiàn)在可以使用另外一種方式來構(gòu)造TF-IDF向量
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(analyzer``=``'word'``, max_features``=``4000``, lowercase = False``)
vectorizer.fit(words)
|
構(gòu)造的模型
[[圖片上傳失敗...(image-813b5b-1580283113447)]](javascript:void(0); "復(fù)制代碼")
<pre>TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.float64'>, encoding='utf-8',
input='content', lowercase=False, max_df=1.0, max_features=4000,
min_df=1, ngram_range=(1, 1), norm='l2', preprocessor=None,
smooth_idf=True, stop_words=None, strip_accents=None,
sublinear_tf=False, token_pattern='(?u)\b\w\w+\b',
tokenizer=None, use_idf=True, vocabulary=None)</pre>
[[圖片上傳失敗...(image-a72dd8-1580283113446)]](javascript:void(0); "復(fù)制代碼")
繼續(xù)貝葉斯算法來建模
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vectorizer.transform(words), y_train)
|
得到的模型為
<pre>MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)</pre>
查看預(yù)測準(zhǔn)確率
classifier.score(vectorizer.transform(test_words), y_test)
|
得到的結(jié)果為:
<pre>0.8152</pre>
可以看出通過TF-IDF向量得到的結(jié)果更好一些,我們也可以更改上面的ngram_range的值來使結(jié)果更好,一般來說值為2就足夠了。
七、總結(jié)
在這個新聞分類的案例中,我們了解了文本分析一般的處理步驟分詞、詞頻統(tǒng)計、詞頻向量或者TF-IDF向量、最后相似度的計算。還學(xué)習(xí)了jieba分詞庫的使用,還有停用詞表的使用,還有TF-IDF關(guān)鍵詞提取以及LDA主題模型,后面還使用到了詞云來進行詞頻的可視化展示,最后還使用到了自然語言處理庫gensim,然后使用機器學(xué)習(xí)中的貝葉斯算法進行最終的分類。
還有就是最重要的一點就是學(xué)習(xí)使用陌生的python庫最好是找官方教程進行模仿學(xué)習(xí),先把結(jié)果進行跑通然后再進行深入的學(xué)習(xí)。