前言
關(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