NLP第3課:動(dòng)手實(shí)戰(zhàn)中文文本中的關(guān)鍵字提取

前言

關(guān)鍵詞提取就是從文本里面把跟這篇文章意義最相關(guān)的一些詞語(yǔ)抽取出來(lái)。這個(gè)可以追溯到文獻(xiàn)檢索初期,關(guān)鍵詞是為了文獻(xiàn)標(biāo)引工作,從報(bào)告、論文中選取出來(lái)用以表示全文主題內(nèi)容信息的單詞或術(shù)語(yǔ),在現(xiàn)在的報(bào)告和論文中,我們依然可以看到關(guān)鍵詞這一項(xiàng)。因此,關(guān)鍵詞在文獻(xiàn)檢索、自動(dòng)文摘、文本聚類(lèi)/分類(lèi)等方面有著重要的應(yīng)用,它不僅是進(jìn)行這些工作不可或缺的基礎(chǔ)和前提,也是互聯(lián)網(wǎng)上信息建庫(kù)的一項(xiàng)重要工作。

關(guān)鍵詞抽取從方法來(lái)說(shuō)主要有兩種:

第一種是關(guān)鍵詞分配:就是給定一個(gè)已有的關(guān)鍵詞庫(kù),對(duì)于新來(lái)的文檔從該詞庫(kù)里面匹配幾個(gè)詞語(yǔ)作為這篇文檔的關(guān)鍵詞。

第二種是關(guān)鍵詞提取:針對(duì)新文檔,通過(guò)算法分析,提取文檔中一些詞語(yǔ)作為該文檔的關(guān)鍵詞。

目前大多數(shù)應(yīng)用領(lǐng)域的關(guān)鍵詞抽取算法都是基于后者實(shí)現(xiàn)的,從邏輯上說(shuō),后者比前者在實(shí)際應(yīng)用中更準(zhǔn)確。

下面介紹一些關(guān)于關(guān)鍵詞抽取的常用和經(jīng)典的算法實(shí)現(xiàn)。

基于 TF-IDF 算法進(jìn)行關(guān)鍵詞提取

在信息檢索理論中,TF-IDF 是 Term Frequency - Inverse Document Frequency 的簡(jiǎn)寫(xiě)。TF-IDF 是一種數(shù)值統(tǒng)計(jì),用于反映一個(gè)詞對(duì)于語(yǔ)料中某篇文檔的重要性。在信息檢索和文本挖掘領(lǐng)域,它經(jīng)常用于因子加權(quán)。TF-IDF 的主要思想就是:如果某個(gè)詞在一篇文檔中出現(xiàn)的頻率高,也即 TF 高;并且在語(yǔ)料庫(kù)中其他文檔中很少出現(xiàn),即 DF 低,也即 IDF 高,則認(rèn)為這個(gè)詞具有很好的類(lèi)別區(qū)分能力。

TF 為詞頻(Term Frequency),表示詞 t 在文檔 d 中出現(xiàn)的頻率,計(jì)算公式:

enter image description here

其中,ni,j 是該詞 ti 在文件 dj 中的出現(xiàn)次數(shù),而分母則是在文件 dj 中所有字詞的出現(xiàn)次數(shù)之和。

IDF 為逆文檔頻率(Inverse Document Frequency),表示語(yǔ)料庫(kù)中包含詞 t 的文檔的數(shù)目的倒數(shù),計(jì)算公式:

enter image description here

其中,|D|表示語(yǔ)料庫(kù)中的文件總數(shù),|{j:ti∈dj}| 包含詞 ti 的文件數(shù)目,如果該詞語(yǔ)不在語(yǔ)料庫(kù)中,就會(huì)導(dǎo)致被除數(shù)為零,因此一般情況下使用 1+|{j:ti∈dj}|。

TF-IDF 在實(shí)際中主要是將二者相乘,也即 TF * IDF, 計(jì)算公式:

enter image description here

因此,TF-IDF 傾向于過(guò)濾掉常見(jiàn)的詞語(yǔ),保留重要的詞語(yǔ)。例如,某一特定文件內(nèi)的高頻率詞語(yǔ),以及該詞語(yǔ)在整個(gè)文件集合中的低文件頻率,可以產(chǎn)生出高權(quán)重的 TF-IDF。

好在 jieba 已經(jīng)實(shí)現(xiàn)了基于 TF-IDF 算法的關(guān)鍵詞抽取,通過(guò)命令import jieba.analyse引入,函數(shù)參數(shù)解釋如下:

sentence:待提取的文本語(yǔ)料;

topK:返回 TF/IDF 權(quán)重最大的關(guān)鍵詞個(gè)數(shù),默認(rèn)值為 20;

withWeight:是否需要返回關(guān)鍵詞權(quán)重值,默認(rèn)值為 False;

allowPOS:僅包括指定詞性的詞,默認(rèn)值為空,即不篩選。

接下來(lái)看例子,我采用的語(yǔ)料來(lái)自于百度百科對(duì)人工智能的定義,獲取 Top20 關(guān)鍵字,用空格隔開(kāi)打印:

importjieba.analyse? sentence? ="人工智能(Artificial Intelligence),英文縮寫(xiě)為AI。它是研究、開(kāi)發(fā)用于模擬、延伸和擴(kuò)展人的智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門(mén)新的技術(shù)科學(xué)。人工智能是計(jì)算機(jī)科學(xué)的一個(gè)分支,它企圖了解智能的實(shí)質(zhì),并生產(chǎn)出一種新的能以人類(lèi)智能相似的方式做出反應(yīng)的智能機(jī)器,該領(lǐng)域的研究包括機(jī)器人、語(yǔ)言識(shí)別、圖像識(shí)別、自然語(yǔ)言處理和專(zhuān)家系統(tǒng)等。人工智能從誕生以來(lái),理論和技術(shù)日益成熟,應(yīng)用領(lǐng)域也不斷擴(kuò)大,可以設(shè)想,未來(lái)人工智能帶來(lái)的科技產(chǎn)品,將會(huì)是人類(lèi)智慧的“容器”。人工智能可以對(duì)人的意識(shí)、思維的信息過(guò)程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過(guò)人的智能。人工智能是一門(mén)極富挑戰(zhàn)性的科學(xué),從事這項(xiàng)工作的人必須懂得計(jì)算機(jī)知識(shí),心理學(xué)和哲學(xué)。人工智能是包括十分廣泛的科學(xué),它由不同的領(lǐng)域組成,如機(jī)器學(xué)習(xí),計(jì)算機(jī)視覺(jué)等等,總的說(shuō)來(lái),人工智能研究的一個(gè)主要目標(biāo)是使機(jī)器能夠勝任一些通常需要人類(lèi)智能才能完成的復(fù)雜工作。但不同的時(shí)代、不同的人對(duì)這種“復(fù)雜工作”的理解是不同的。2017年12月,人工智能入選“2017年度中國(guó)媒體十大流行語(yǔ)”。"keywords ="? ".join(jieba.analyse.extract_tags(sentence , topK=20,? ? ? ? ? ? ? ? withWeight=False, allowPOS=()))? print(keywords)

執(zhí)行結(jié)果:

人工智能? 智能? 2017? 機(jī)器? 不同? 人類(lèi)? 科學(xué)? 模擬? 一門(mén)? 技術(shù)? 計(jì)算機(jī)? 研究? 工作? Artificial? Intelligence? AI? 圖像識(shí)別? 12? 復(fù)雜? 流行語(yǔ)

下面只獲取 Top10 的關(guān)鍵字,并修改一下詞性,只選擇名詞和動(dòng)詞,看看結(jié)果有何不同?

keywords =(jieba.analyse.extract_tags(sentence , topK=10, withWeight=True, allowPOS=(['n','v'])))print(keywords)

執(zhí)行結(jié)果:

[('人工智能', 0.9750542675762887), ('智能', 0.5167124540885567), ('機(jī)器', 0.20540911929525774), ('人類(lèi)', 0.17414426566082475), ('科學(xué)', 0.17250169374402063), ('模擬', 0.15723537382948452), ('技術(shù)', 0.14596259315164947), ('計(jì)算機(jī)', 0.14030483362639176), ('圖像識(shí)別', 0.12324502580309278), ('流行語(yǔ)', 0.11242211730309279)]

基于 TextRank 算法進(jìn)行關(guān)鍵詞提取

TextRank 是由 PageRank 改進(jìn)而來(lái),核心思想將文本中的詞看作圖中的節(jié)點(diǎn),通過(guò)邊相互連接,不同的節(jié)點(diǎn)會(huì)有不同的權(quán)重,權(quán)重高的節(jié)點(diǎn)可以作為關(guān)鍵詞。這里給出 TextRank 的公式:

enter image description here

節(jié)點(diǎn) i 的權(quán)重取決于節(jié)點(diǎn) i 的鄰居節(jié)點(diǎn)中 i-j 這條邊的權(quán)重 / j 的所有出度的邊的權(quán)重 * 節(jié)點(diǎn) j 的權(quán)重,將這些鄰居節(jié)點(diǎn)計(jì)算的權(quán)重相加,再乘上一定的阻尼系數(shù),就是節(jié)點(diǎn) i 的權(quán)重,阻尼系數(shù) d 一般取 0.85。

TextRank 用于關(guān)鍵詞提取的算法如下:

(1)把給定的文本 T 按照完整句子進(jìn)行分割,即:

enter image description here

(2)對(duì)于每個(gè)句子,進(jìn)行分詞和詞性標(biāo)注處理,并過(guò)濾掉停用詞,只保留指定詞性的單詞,如名詞、動(dòng)詞、形容詞,其中 ti,j 是保留后的候選關(guān)鍵詞。

enter image description here

(3)構(gòu)建候選關(guān)鍵詞圖 G = (V,E),其中 V 為節(jié)點(diǎn)集,由(2)生成的候選關(guān)鍵詞組成,然后采用共現(xiàn)關(guān)系(Co-Occurrence)構(gòu)造任兩點(diǎn)之間的邊,兩個(gè)節(jié)點(diǎn)之間存在邊僅當(dāng)它們對(duì)應(yīng)的詞匯在長(zhǎng)度為 K 的窗口中共現(xiàn),K 表示窗口大小,即最多共現(xiàn) K 個(gè)單詞。

(4)根據(jù) TextRank 的公式,迭代傳播各節(jié)點(diǎn)的權(quán)重,直至收斂。

(5)對(duì)節(jié)點(diǎn)權(quán)重進(jìn)行倒序排序,從而得到最重要的 T 個(gè)單詞,作為候選關(guān)鍵詞。

(6)由(5)得到最重要的 T 個(gè)單詞,在原始文本中進(jìn)行標(biāo)記,若形成相鄰詞組,則組合成多詞關(guān)鍵詞。

同樣 jieba 已經(jīng)實(shí)現(xiàn)了基于 TextRank 算法的關(guān)鍵詞抽取,通過(guò)命令import jieba.analyse引用,函數(shù)參數(shù)解釋如下:

jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns','n','vn','v'))

直接使用,接口參數(shù)同 TF-IDF 相同,注意默認(rèn)過(guò)濾詞性。

接下來(lái),我們繼續(xù)看例子,語(yǔ)料繼續(xù)使用上例中的句子。

result ="? ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns','n','vn','v')))print(result)

執(zhí)行結(jié)果:

智能 人工智能 機(jī)器 人類(lèi) 研究 技術(shù) 模擬 包括 科學(xué) 工作 領(lǐng)域 理論 計(jì)算機(jī) 年度 需要 語(yǔ)言 相似 方式 做出 心理學(xué)

如果修改一下詞性,只需要名詞和動(dòng)詞,看看結(jié)果有何不同?

result ="? ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('n','v')))print(result)

執(zhí)行結(jié)果:

智能 人工智能 機(jī)器 人類(lèi) 技術(shù) 模擬 包括 科學(xué) 理論 計(jì)算機(jī) 領(lǐng)域 年度 需要 心理學(xué) 信息 語(yǔ)言 識(shí)別 帶來(lái) 過(guò)程 延伸

基于 LDA 主題模型進(jìn)行關(guān)鍵詞提取

語(yǔ)料是一個(gè)關(guān)于汽車(chē)的短文本,下面通過(guò) Gensim 庫(kù)完成基于 LDA 的關(guān)鍵字提取。整個(gè)過(guò)程的步驟為:文件加載 -> jieba 分詞 -> 去停用詞 -> 構(gòu)建詞袋模型 -> LDA 模型訓(xùn)練 -> 結(jié)果可視化。

#引入庫(kù)文件importjieba.analyseasanalyseimportjiebaimportpandasaspdfromgensimimportcorpora, models, similaritiesimportgensimimportnumpyasnpimportmatplotlib.pyplotasplt? ? %matplotlib inline#設(shè)置文件路徑dir ="/Users/jianliu/Downloads/"file_desc ="".join([dir,'car.csv'])? ? stop_words ="".join([dir,'stopwords.txt'])#定義停用詞stopwords=pd.read_csv(stop_words,index_col=False,quoting=3,sep="\t",names=['stopword'], encoding='utf-8')? ? stopwords=stopwords['stopword'].values#加載語(yǔ)料df = pd.read_csv(file_desc, encoding='gbk')#刪除nan行df.dropna(inplace=True)? ? lines=df.content.values.tolist()#開(kāi)始分詞sentences=[]forlineinlines:try:? ? ? ? ? ? segs=jieba.lcut(line)? ? ? ? ? ? segs = [vforvinsegsifnotstr(v).isdigit()]#去數(shù)字segs = list(filter(lambdax:x.strip(), segs))#去左右空格segs = list(filter(lambdax:xnotinstopwords, segs))#去掉停用詞sentences.append(segs)exceptException:? ? ? ? ? ? print(line)continue#構(gòu)建詞袋模型dictionary = corpora.Dictionary(sentences)? ? corpus = [dictionary.doc2bow(sentence)forsentenceinsentences]#lda模型,num_topics是主題的個(gè)數(shù),這里定義了5個(gè)lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10)#我們查一下第1號(hào)分類(lèi),其中最常出現(xiàn)的5個(gè)詞是:print(lda.print_topic(1, topn=5))#我們打印所有5個(gè)主題,每個(gè)主題顯示8個(gè)詞fortopicinlda.print_topics(num_topics=10, num_words=8):? ? ? ? print(topic[1])

執(zhí)行結(jié)果如下圖所示:

enter image description here

#顯示中文matplotlibplt.rcParams['font.sans-serif'] = [u'SimHei']? ? plt.rcParams['axes.unicode_minus'] =False# 在可視化部分,我們首先畫(huà)出了九個(gè)主題的7個(gè)詞的概率分布圖num_show_term =8# 每個(gè)主題下顯示幾個(gè)詞num_topics? =10fori, kinenumerate(range(num_topics)):? ? ? ? ax = plt.subplot(2,5, i+1)? ? ? ? item_dis_all = lda.get_topic_terms(topicid=k)? ? ? ? item_dis = np.array(item_dis_all[:num_show_term])? ? ? ? ax.plot(range(num_show_term), item_dis[:,1],'b*')? ? ? ? item_word_id = item_dis[:,0].astype(np.int)? ? ? ? word = [dictionary.id2token[i]foriinitem_word_id]? ? ? ? ax.set_ylabel(u"概率")forjinrange(num_show_term):? ? ? ? ? ? ax.text(j, item_dis[j,1], word[j], bbox=dict(facecolor='green',alpha=0.1))? ? plt.suptitle(u'9個(gè)主題及其7個(gè)主要詞的概率', fontsize=18)? ? plt.show()

執(zhí)行結(jié)果如下圖所示:

enter image description here

基于 pyhanlp 進(jìn)行關(guān)鍵詞提取

除了 jieba,也可以選擇使用 HanLP 來(lái)完成關(guān)鍵字提取,內(nèi)部采用 TextRankKeyword 實(shí)現(xiàn),語(yǔ)料繼續(xù)使用上例中的句子。

frompyhanlpimport*? ? result = HanLP.extractKeyword(sentence,20)? ? print(result)

執(zhí)行結(jié)果:

[人工智能, 智能, 領(lǐng)域, 人類(lèi), 研究, 不同, 工作, 包括, 模擬, 新的, 機(jī)器, 計(jì)算機(jī), 門(mén), 科學(xué), 應(yīng)用, 系統(tǒng), 理論, 技術(shù), 入選, 復(fù)雜]

總結(jié)

本節(jié)內(nèi)容的重點(diǎn)就是掌握關(guān)鍵字提取的基本方法,常規(guī)的關(guān)鍵詞提取方法如上所述,當(dāng)然還有其他算法及其改進(jìn),有深入研究需求的,可以下載關(guān)鍵字提取方面的論文閱讀。


鏈接:http://www.lxweimin.com/p/a796ca559409

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,675評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

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