一九秀、基礎知識
假設有一份文本數(shù)據(jù)如下,數(shù)據(jù)量很大粘我,現(xiàn)在要對整個語料庫進行文本分析鼓蜒,category代表新聞種類,theme代表新聞主題征字,URL代表新聞鏈接地址都弹,content代表新聞主題內容
停用詞:在content這一列,在數(shù)據(jù)量很大的情況匙姜,很容易發(fā)現(xiàn)某些似乎與新聞本身意義不大的詞大量出現(xiàn)畅厢,而我們就把這些在語料庫中大量出現(xiàn)但是又沒啥大用的詞叫做停用詞,在數(shù)據(jù)集鏈接中包含一份常見的停用詞氮昧,如下所示:
TF-IDF:用于關鍵詞提取或详。比如在一篇名叫《中國的蜜蜂養(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)鸟辅,那么它很可能就反映了這篇文章的特性,那它正是我們所需要的關鍵詞莺葫。
計算公式
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值比中國這個詞大瘫俊,那么這篇文章的關鍵詞重要性依次為蜜蜂、養(yǎng)殖和中國悴灵。
文本相似度:假設有如下兩個句子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]
相似度計算方法:最常用通過余弦進行計算
二白群、任務簡介與數(shù)據(jù)預處理
現(xiàn)在我們手里一份新聞數(shù)據(jù)尚胞,數(shù)據(jù)里面包含新聞的內容以及新聞的種類等等,我們要做的就是對新聞進行一個分類任務帜慢,比如說汽車類時尚類等等笼裳。
數(shù)據(jù)集鏈接:https://pan.baidu.com/s/1fG_oagJT69bIgCZgasn_Ig 提取碼:yzd0
導入相關的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為新聞的主體內容
查看數(shù)據(jù)集維度
df_news.shape
得到的結果
<pre>(5000, 4)</pre>
將新聞內容轉換為list方便進行分詞并查看第1000條數(shù)據(jù)內容
content
=
df_news.content.values.tolist()
# 轉換為list 實際上是二維list
print``(content[``1000``])
內容為:
<pre>阿里巴巴集團昨日宣布粱玲,將在集團管理層面設立首席數(shù)據(jù)官崗位(Chief」怼Data Officer)抽减,阿里巴巴B2B公
司CEO陸兆禧將會出任上述職務允青,向集團CEO馬云直接匯報。>菹ぃ和6月初的首席風險官職務任命相同卵沉,首席數(shù)據(jù)官亦為阿
里巴巴集團在完成與雅虎股權談判颠锉,推進“one company”目標后史汗,在集團決策層面新增的管理崗位琼掠。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ù)分詞后的內容
content_S[``1000``]
轉為pandas支持的DataFrame格式
df_content
=
pd.DataFrame({``'content_S'``:content_S})
# 轉換為DataFrame
df_content.head()
分完詞后的結果為:
可以發(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()
結果為:
刪除語料庫中的停用詞副硅,這里面的all_words是為了后面的詞云展示姥宝。
# 刪除新聞中的停用詞
def
drop_stopwords(contents, stopwords):
contents_clean
=
[]
# 刪除后的新聞
all_words
=
[]
# 構造詞云所用的數(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()
|
查看刪除停用詞后的新聞內容
df_content
=
pd.DataFrame({``'contents_clean'``:contents_clean})
df_content.head()
|
從結果可以看出,這次的數(shù)據(jù)對比上面的數(shù)據(jù)來說質量提高了很多恐疲。
查看一下出現(xiàn)的所有的詞匯腊满,也就是刪除停用詞后的all_words套么。
df_all_words
=
pd.DataFrame({``'all_words'``:all_words})
df_all_words.head()
結果為:
統(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()
|
結果為:
四胚泌、詞云展示
導入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)
|
可視化結果為:
五、TF-IDF以及LDA主題模型
TF-IDF關鍵詞提取
import
jieba.analyse
index
=
2400
print``(df_news[``'content'``][index])
content_S_str
=
''.join(content_S[index])
# 提取關鍵詞
print``(``" "``.join(jieba.analyse.extract_tags(content_S_str,topK``=``5``,withWeight
=
False``)))
可以得到第2400條數(shù)據(jù)以及關鍵詞
[[圖片上傳失敗...(image-f8426a-1580283113449)]](javascript:void(0); "復制代碼")
<pre>法國VS西班牙肃弟、里貝里VS哈維玷室,北京時間6月24日凌晨一場的大戰(zhàn)舉世矚目,而這場勝利不僅僅關乎兩支頂級強隊的命運笤受,同時也是他們背后
的球衣贊助商耐克和阿迪達斯之間的一次角逐穷缤。T諶胙”窘炫分薇的16支球隊之中,阿迪達斯和耐克的勢力范圍也是幾乎旗鼓相當:其中有5家球
衣由耐克提供箩兽,而阿迪達斯則贊助了6家津肛,此外茵寶有3家,而剩下的兩家則由彪馬贊助汗贫。而當比賽進行到現(xiàn)在身坐,率先挺進四強的兩支球隊分別被耐
克支持的葡萄牙和阿迪達斯支持的德國占據(jù),而由于最后一場1/4決賽是茵寶(英格蘭)和彪馬(意大利)的對決落包,這也意味著明天凌晨西班牙同
法國這場阿迪達斯和耐克在1/4決賽的唯一一次直接交手將直接決定兩家體育巨頭在此次歐洲杯上的勝負部蛇。8據(jù)評估,在2012年足球商品的銷
售額能總共超過40億歐元妥色,而單單是不足一個月的歐洲杯就有高達5億的銷售額搪花,也就是說在歐洲杯期間將有700萬件球衣被搶購一空。根據(jù)市
場評估嘹害,兩大巨頭阿迪達斯和耐克的市場占有率也是并駕齊驅撮竿,其中前者占據(jù)38%,而后者占據(jù)36%笔呀。體育權利顧問奧利弗-米歇爾在接受《隊
報》采訪時說:“歐洲杯是耐克通過法國翻身的一個絕佳機會幢踏!”C仔爾接著談到兩大贊助商的經營策略:“競技體育的成功會燃起球衣購買的熱情,
不過即便是水平相當许师,不同國家之間的歐洲杯效應卻存在不同房蝉。在德國就很出色,大約1/4的德國人通過電視觀看了比賽微渠,而在西班牙效果則差很
多搭幻,由于民族主義高漲的加泰羅尼亞地區(qū)只關注巴薩和巴薩的球衣,他們對西班牙國家隊根本沒什么興趣逞盆√刺#”因此盡管西班牙接連拿下歐洲杯和世界
杯,但是阿迪達斯只為西班牙足協(xié)支付每年2600萬的贊助費#相比之下盡管最近兩屆大賽表現(xiàn)糟糕法國足協(xié)將從耐克手中每年可以得到4000
萬歐元云芦。米歇爾解釋道:“法國創(chuàng)紀錄的4000萬歐元贊助費得益于阿迪達斯和耐克競逐未來15年歐洲市場的競爭俯逾。耐克需要籠絡一個大國來打
贏這場歐洲大陸的戰(zhàn)爭贸桶,而盡管德國拿到的贊助費并不太高,但是他們卻顯然牢牢掌握在民族品牌阿迪達斯手中桌肴。從長期投資來看皇筛,耐克給法國的
贊助并不算過高∽蛊撸”
耐克 阿迪達斯 歐洲杯 球衣 西班牙</pre>
[[圖片上傳失敗...(image-45ca34-1580283113449)]](javascript:void(0); "復制代碼")
從最后一句話就可以大致得到這段文章的大致意思碳锈,那這些詞就是這段文章的關鍵詞抖剿。
LDA(Latent Dirichlet Allocation)是一種文檔主題生成模型飒筑,它是一種主題模型咏雌,它包含文章换团,主題和詞三個部分悉稠,它可以將文檔集中每篇文檔的主題以概率分布的形式給出,從而通過分析一些文檔抽取出它們的主題(分布)出來后艘包,便可以根據(jù)主題(分布)進行主題聚類或文本分類的猛。同時,它是一種典型的詞袋模型想虎,即一篇文檔是由一組詞構成卦尊,詞與詞之間沒有先后順序的關系。此外舌厨,一篇文檔可以包含多個主題岂却,文檔中每一個詞都由其中的一個主題生成。LDA就是要干的事就是根據(jù)給定的一篇文檔裙椭,推測其主題分布躏哩。它是一個無監(jiān)督學習,類似于聚類揉燃。
導入gensim庫扫尺,需要自己手動安裝
# pip install gensim
from
gensim
import
corpora,models,similarities
import
gensim
# 自然語言處理庫
#http://radimrehurek.com/gensim/ # 需要用時可以自行查閱官方文檔
進行詞映射,相當于一個大的字典炊汤,每一個詞匯進行一個映射正驻。
# 做映射,相當于詞袋 格式要求: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號主題的結果姑曙,然后選出這個主題中權重值最高的5個關鍵詞。
# 一號分類結果
print``(lda.print_topic(``1``, topn``=``5``))
|
分類后結果為:
<pre>0.008"說" + 0.007"男人" + 0.005"愛情" + 0.005"中" + 0.004*"離婚"</pre>
查看這20個主題的關鍵詞
for
topic
in
lda.print_topics(num_topics``=``20``,num_words``=``5``):
print``(topic[``1``])
|
結果為:
[[圖片上傳失敗...(image-6d21e9-1580283113449)]](javascript:void(0); "復制代碼")
<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"導演" + 0.010"影片" + 0.008"中" + 0.006"主演"
0.009"節(jié)目" + 0.007"中" + 0.006"說" + 0.004"主持人" + 0.004"吃"
0.006"學校" + 0.004"工作" + 0.004"學生" + 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"產品" + 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); "復制代碼")
六迈倍、使用貝葉斯進行分類
先將清洗好的數(shù)據(jù)轉換為pandas支持的DataFrame格式
df_train``=``pd.DataFrame({``'contents_clean'``:contents_clean,``'label'``:df_news[``'category'``]})
df_train.tail()
得到的結果為:
查看數(shù)據(jù)集所有類別
df_train.label.unique()
結果:
<pre>array(['汽車', '財經', '科技', '健康', '體育', '教育', '文化', '軍事', '娛樂', '時尚'],
dtype=object)</pre>
使用pandas對類別進行映
label_mapping
=
{``"汽車"``:
1``,
"財經"``:
2``,
"科技"``:
3``,
"健康"``:
4``,
"體育"``:``5``,
"教育"``:
6``,``"文化"``:
7``,``"軍事"``:
8``,``"娛樂"``:
9``,``"時尚"``:
0``}
df_train[``'label'``]
=
df_train[``'label'``].``map``(label_mapping)
df_train.head()
|
得到的結果是
下面開始常規(guī)的機器學習套路進行分類伤靠,首先劃分訓練集與測試集
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_train = x_train.flatten()
x_train[``0``][``1``]
|
結果:
<pre>'上海'</pre>
訓練集數(shù)據(jù)轉為字符串數(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); "復制代碼")
<pre>'中新網(wǎng) 上海 日電 于俊 父親節(jié) 網(wǎng)絡 吃 一頓 電影 快餐 微 電影 爸 對不起 我愛你 定于 本月 父親節(jié) 當天 各大 視頻 網(wǎng)站
首映 葜 譜 鞣 劍 保慈 障蚣 欽 囈 檣 埽 ⒌ 纈 埃 ǎ 停 椋 悖 潁 鎩 媯 椋 恚 稱 微型 電影 新 媒體 平臺 播放 狀態(tài)
短時 休閑 狀態(tài) 觀看 完整 策劃 系統(tǒng) 制作 體系 支持 顯示 較完整 故事情節(jié) 電影 微 超短 放映 微 周期 制作 天 數(shù)周 微
規(guī)模 投資 人民幣 幾千 數(shù)萬元 每部 內容 融合 幽默 搞怪 時尚 潮流 人文 言情 公益 教育 商業(yè) 定制 主題 單獨 成篇 系列
成劇 唇 開播 微 電影 爸 對不起 我愛你 講述 一對 父子 觀念 缺少 溝通 導致 關系 父親 傳統(tǒng) 固執(zhí) 鐘情 傳統(tǒng) 生活 方式
兒子 新派 音樂 達 習慣 晚出 早 生活 性格 張揚 叛逆 兩種 截然不同 生活 方式 理念 差異 一場 父子 間 拉開序幕 子 失
手 打破 父親 心愛 物品 父親 趕出 家門 劇情 演繹 父親節(jié) 妹妹 哥哥 化解 父親 這場 矛盾 映逋壞 嚼 斫 狻 ⒍ 粵 ⒌ 槳
容 爭執(zhí) 退讓 傳統(tǒng) 尷尬 父子 尷尬 情 男人 表達 心中 那份 感恩 一杯 濾掛 咖啡 父親節(jié) 變得 溫馨 鎂 纈 繕 蝦 N 逄 煳
幕 傳播 迪歐 咖啡 聯(lián)合 出品 出品人 希望 觀摩 捫心自問 父親節(jié) 父親 記得 父親 生日 哪一天 父親 愛喝 跨出 家門 那一
刻 感覺 一顆 顫動 心 操勞 天下 兒女 父親節(jié) 大聲 喊出 父親 家人 愛 完'</pre>
[[圖片上傳失敗...(image-29c304-1580283113447)]](javascript:void(0); "復制代碼")
打印word的長度
print``(``len``(words))
|
word長度為
<pre>3750</pre>
使用一個小例子用sklearn將詞轉換為詞頻向量
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``))
|
結果是
[[圖片上傳失敗...(image-35649a-1580283113447)]](javascript:void(0); "復制代碼")
<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); "復制代碼")
改變參數(shù)試一下醋界,ngram_range表示1到4個詞進行組合竟宋,讓向量更加復雜
|
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對上面構造的數(shù)據(jù)(也就是特定格式的數(shù)據(jù))轉換為詞頻向量
from
sklearn.feature_extraction.text
import
CountVectorizer
vec
=
CountVectorizer(analyzer``=``'word'``, max_features``=``4000``, lowercase
=
False``)
vec.fit(words)
|
構造的模型為
[[圖片上傳失敗...(image-2978ce-1580283113447)]](javascript:void(0); "復制代碼")
<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); "復制代碼")
然后使用貝葉斯算法完成結果分類,傳入的參數(shù)是剛才的詞頻向量
from
sklearn.naive_bayes
import
MultinomialNB
classifier
=
MultinomialNB()
classifier.fit(vec.transform(words), y_train)
|
構造的模型為
<pre>MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)</pre>
還是將數(shù)據(jù)轉換為字符串形纺,使用測試集來進行測試
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); "復制代碼")
<pre>'國家 公務員 考試 申論 應用文 類 試題 實質 一道 集 概括 分析 提出 解決問題 一體 綜合性 試題 說 一道 客觀
凝練 申發(fā) 論述 文章 題目 分析 歷年 國考 申論 真題 公文 類 試題 類型 多樣 包括 公文 類 事務性 文書 類 題
材 從題 干 作答 材料 內容 整合 分析 無需 太 創(chuàng)造性 發(fā)揮 縱觀 歷年 申論 真題 作答 應用文 類 試題 文種 格
式 作出 特別 重在 內容 考查 行文 格式 考生 平常心 面對 應用文 類 試題 準確 把握 作答 領會 內在 含義 把
握 題材 主旨 材料 結構 輕松 應對 應用文 類 試題 R 弧 ⒆ 釩 鹽 展文 寫作 原則 T 材料 中來 應用文 類 試
題 材料 總體 把握 客觀 考生 材料 中來 材料 中 把握 材料 準確 理解 題材 主旨 T 政府 角度 作答 應用文 類
試題 更應 注重 政府 角度 觀點 政府 角度 出發(fā) 原則 表述 觀點 提出 解決 之策 考生 作答 站 政府 人員 角度
看待 提出 解決問題 T 文體 結構 形式 考查 重點 文體 結構 大部分 評分 關鍵點 解答 方法 薄 ⒆ ス 丶 詞
明 方向 作答 題目 題干 作答 作答 方向 作答 角度 關鍵 向導 考生 仔細閱讀 題干 作答 抓住 關鍵詞 作答 方向
相關 要點 整理 作答 思路 年國考 地市級 真 題為 例 潦惺姓 府 宣傳 推進 近海 水域 污染 整治 工作 請 給定
資料 市政府 工作人員 身份 草擬 一份 宣傳 綱要 R 求 保對 宣傳 內容 要點 提綱挈領 陳述 玻 體現(xiàn) 政府 精
神 全市 各界 關心 支持 污染 整治 工作 通俗易懂 超過 字 骯 丶 詞 近海 水域 污染 整治 工作 市政府 工作人
員 身份 宣傳 綱要 提綱挈領 陳述 體現(xiàn) 政府 精神 全市 各界 關心 支持 污染 整治 工作 通俗易懂 提示 歸結
作答 要點 包括 污染 情況 原因 解決 對策 作答 思路 情況 原因 對策 意義 邏輯 順序 安排 文章 結構 病 ⒋
缶殖 齜 ⅲ 明 結構 解答 應用文 類 試題 考生 材料 整體 出發(fā) 大局 出發(fā) 高屋建瓴 把握 材料 主題 思想 事件
起因 解決 對策 閱讀文章 構建 文章 結構 直至 快速 解答 場 ⒗ 硭 乘悸 罰明 邏輯 應用文 類 試題 嚴密 邏
輯思維 情況 原因 對策 意義 考生 作答 先 弄清楚 解答 思路 統(tǒng)籌安排 脈絡 清晰 邏輯 表達 內容 表述 礎
把握 明 詳略 考生 仔細閱讀 分析 揣摩 應用文 類 試題 內容 答題 時要 詳略 得當 主次 分明 安排 內容 增加
文章 層次感 閱卷 老師 閱卷 時能 明白 清晰 一目了然 玻埃 保蹦旯 考 考試 申論 試卷 分為 省級 地市級 兩套
試卷 能力 大有 省級 申論 試題 考生 宏觀 角度看 注重 深度 廣度 考生 深謀遠慮 地市級 試題 考生 微觀 視角
觀察 側重 考查 解決 能力 考生 貫徹執(zhí)行 作答 區(qū)別對待'</pre>
[[圖片上傳失敗...(image-688ea6-1580283113447)]](javascript:void(0); "復制代碼")
查看預測準確率為
classifier.score(vec.transform(test_words), y_test)
|
準確率為:
<pre>0.804</pre>
現(xiàn)在可以使用另外一種方式來構造TF-IDF向量
from
sklearn.feature_extraction.text
import
TfidfVectorizer
vectorizer
=
TfidfVectorizer(analyzer``=``'word'``, max_features``=``4000``, lowercase
=
False``)
vectorizer.fit(words)
|
構造的模型
[[圖片上傳失敗...(image-813b5b-1580283113447)]](javascript:void(0); "復制代碼")
<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); "復制代碼")
繼續(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>
查看預測準確率
classifier.score(vectorizer.transform(test_words), y_test)
|
得到的結果為:
<pre>0.8152</pre>
可以看出通過TF-IDF向量得到的結果更好一些丘侠,我們也可以更改上面的ngram_range的值來使結果更好,一般來說值為2就足夠了逐样。
七蜗字、總結
在這個新聞分類的案例中,我們了解了文本分析一般的處理步驟分詞脂新、詞頻統(tǒng)計挪捕、詞頻向量或者TF-IDF向量、最后相似度的計算争便。還學習了jieba分詞庫的使用级零,還有停用詞表的使用,還有TF-IDF關鍵詞提取以及LDA主題模型滞乙,后面還使用到了詞云來進行詞頻的可視化展示奏纪,最后還使用到了自然語言處理庫gensim,然后使用機器學習中的貝葉斯算法進行最終的分類斩启。
還有就是最重要的一點就是學習使用陌生的python庫最好是找官方教程進行模仿學習序调,先把結果進行跑通然后再進行深入的學習。