日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

python中文模糊关键词提取_如何用Python提取中文关键词?

發(fā)布時(shí)間:2024/3/26 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中文模糊关键词提取_如何用Python提取中文关键词? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文一步步為你演示,如何用Python從中文文本中提取關(guān)鍵詞。如果你需要對(duì)長(zhǎng)文“觀其大略”,不妨嘗試一下。

需求

好友最近對(duì)自然語(yǔ)言處理感興趣,因?yàn)樗蛩憷米詣?dòng)化方法從長(zhǎng)文本里提取關(guān)鍵詞,來確定主題。

他向我詢問方法,我推薦他閱讀我的那篇《如何用Python從海量文本提取主題?》。

看過之后,他表示很有收獲,但是應(yīng)用場(chǎng)景和他自己的需求有些區(qū)別。

《如何用Python從海量文本提取主題?》一文面對(duì)的是大量的文檔,利用主題發(fā)現(xiàn)功能對(duì)文章聚類。而他不需要處理很多的文檔,也沒有聚類的需求,但是需要處理的每篇文檔都很長(zhǎng),希望通過自動(dòng)化方法從長(zhǎng)文提取關(guān)鍵詞,以觀其大略。

我突然發(fā)現(xiàn),之前居然忘了寫文,介紹單一文本關(guān)鍵詞的提取方法。

雖然這個(gè)功能實(shí)現(xiàn)起來并不復(fù)雜,但是其中也有些坑,需要避免踩進(jìn)去的。

通過本文,我一步步為你演示如何用Python實(shí)現(xiàn)中文關(guān)鍵詞提取這一功能。

環(huán)境

Python

第一步是安裝Python運(yùn)行環(huán)境。我們使用集成環(huán)境Anaconda。

請(qǐng)到這個(gè)網(wǎng)址 下載最新版的Anaconda。下拉頁(yè)面,找到下載位置。根據(jù)你目前使用的系統(tǒng),網(wǎng)站會(huì)自動(dòng)推薦給你適合的版本下載。我使用的是macOS,下載文件格式為pkg。

下載頁(yè)面區(qū)左側(cè)是Python 3.6版,右側(cè)是2.7版。請(qǐng)選擇2.7版本。

雙擊下載后的pkg文件,根據(jù)中文提示一步步安裝即可。

樣例

我專門為你準(zhǔn)備了一個(gè)github項(xiàng)目,存放本文的配套源代碼和數(shù)據(jù)。請(qǐng)從這個(gè)地址下載壓縮包文件,然后解壓。

解壓后的目錄名稱為demo-keyword-extraction-master,樣例目錄包含以下內(nèi)容:

除了README.md這個(gè)github項(xiàng)目默認(rèn)說明文件外,目錄下還有兩個(gè)文件,分別是數(shù)據(jù)文件sample.txt和程序源代碼文件demo-extract-keyword.ipynb。

結(jié)巴分詞

我們使用的關(guān)鍵詞提取工具為結(jié)巴分詞。

之前在《如何用Python做中文分詞?》一文中,我們?cè)?jīng)使用過該工具為中文語(yǔ)句做分詞。這次我們使用的,是它的另一項(xiàng)功能,即關(guān)鍵詞提取。

請(qǐng)進(jìn)入終端,使用cd命令進(jìn)入解壓后的文件夾demo-keyword-extraction-master,輸入以下命令:

pip install jieba

復(fù)制代碼

好了,軟件包工具也已經(jīng)準(zhǔn)備就緒。下面我們執(zhí)行

jupyter notebook

復(fù)制代碼

進(jìn)入到Jupyter筆記本環(huán)境。

到這里,環(huán)境已經(jīng)準(zhǔn)備好了,我們下面來介紹本文使用的中文文本數(shù)據(jù)。

數(shù)據(jù)

一開始,我還曾為尋找現(xiàn)成的中文文本發(fā)愁。

網(wǎng)上可以找到的中文文本浩如煙海。

但是拿來做演示,是否會(huì)有版權(quán)問題,我就不確定了。萬(wàn)一把哪位大家之作拿來做了分析,人家可能就要過問一句“這電子版你是從哪里搞到的啊?”

萬(wàn)一再因此提出訴訟,我可無法招架。

后來發(fā)現(xiàn),我這簡(jiǎn)直就是自尋煩惱——找別人的文本干什么?用我自己的不就好了?

這一年多以來,我寫的文章已有90多篇,總字?jǐn)?shù)已經(jīng)超過了27萬(wàn)。

我特意從中找了一篇非技術(shù)性的,以避免提取出的關(guān)鍵詞全都是Python命令。

我選取的,是去年的那篇《網(wǎng)約車司機(jī)二三事》。

這篇文章,講的都是些比較有趣的小故事。

我從網(wǎng)頁(yè)上摘取文字,存儲(chǔ)到sample.txt中。

注意,這里是很容易踩坑的地方。在夏天的一次工作坊教學(xué)中,好幾位同學(xué)因?yàn)閺木W(wǎng)上摘取中文文本出現(xiàn)問題,卡住很長(zhǎng)時(shí)間。

這是因?yàn)椴煌谟⒄Z(yǔ),漢字有編碼問題。不同系統(tǒng)都有不同的默認(rèn)編碼,不同版本的Python接受的編碼也不同。你從網(wǎng)上下載的文本文件,也可能與你系統(tǒng)的編碼不統(tǒng)一。

不論如何,這些因素都有可能導(dǎo)致你打開后的文本里,到處都是看不懂的亂碼。

因而,正確的使用中文文本數(shù)據(jù)方式,是你在Jupyter Notebook里面,新建一個(gè)文本文件。

然后,會(huì)出現(xiàn)以下的空白文件。

把你從別處下載的文本,用任意一種能正常顯示的編輯器打開,然后拷貝全部?jī)?nèi)容,粘貼到這個(gè)空白文本文件中,就能避免編碼錯(cuò)亂。

避開了這個(gè)坑,可以為你節(jié)省很多不必要的煩惱嘗試。

好了,知道了這個(gè)竅門,下面你就能愉快地進(jìn)行關(guān)鍵詞提取了。

執(zhí)行

回到Jupyter Notebook的主界面,點(diǎn)擊demo-extract-keyword.ipynb,你就能看到源碼了。

對(duì),你沒看錯(cuò)。只需要這短短的4個(gè)語(yǔ)句,就能完成兩種不同方式(TF-idf與TextRank)的關(guān)鍵詞提取。

本部分我們先講解執(zhí)行步驟。不同關(guān)鍵詞提取方法的原理,我們放在后面介紹。

首先我們從結(jié)巴分詞的分析工具箱里導(dǎo)入所有的關(guān)鍵詞提取功能。

from jieba.analyse import *

復(fù)制代碼

在對(duì)應(yīng)的語(yǔ)句上,按下Shift+Enter組合按鍵,就可以執(zhí)行語(yǔ)句,獲取結(jié)果了。

然后,讓Python打開我們的樣例文本文件,并且讀入其中的全部?jī)?nèi)容到data變量。

with open('sample.txt') as f:

data = f.read()

復(fù)制代碼

使用TF-idf方式提取關(guān)鍵詞和權(quán)重,并且依次顯示出來。如果你不做特殊指定的話,默認(rèn)顯示數(shù)量為20個(gè)關(guān)鍵詞。

for keyword, weight in extract_tags(data, withWeight=True):

print('%s %s' % (keyword, weight))

復(fù)制代碼

顯示內(nèi)容之前,會(huì)有一些提示,不要管它。

Building prefix dict from the default dictionary ...

Loading model from cache /var/folders/8s/k8yr4zy52q1dh107gjx280mw0000gn/T/jieba.cache

Loading model cost 0.547 seconds.

Prefix dict has been built succesfully.

復(fù)制代碼

然后列表就出來了:

優(yōu)步 0.280875594782

司機(jī) 0.119951947597

乘客 0.105486129485

師傅 0.0958888107815

張師傅 0.0838162334963

目的地 0.0753618512886

網(wǎng)約車 0.0702188986954

姐姐 0.0683412127766

自己 0.0672533110661

上車 0.0623276916308

活兒 0.0600134354214

天津 0.0569158056792

10 0.0526641740216

開優(yōu)步 0.0526641740216

事兒 0.048554456767

李師傅 0.0485035501943

天津人 0.0482653686026

繞路 0.0478244723097

出租車 0.0448480260748

時(shí)候 0.0440840298591

復(fù)制代碼

我看了一下,覺得關(guān)鍵詞提取還是比較靠譜的。當(dāng)然,其中也混入了個(gè)數(shù)字10,好在無傷大雅。

如果你需要修改關(guān)鍵詞數(shù)量,就需要指定topK參數(shù)。例如你要輸出10個(gè)關(guān)鍵詞,可以這樣執(zhí)行:

for keyword, weight in extract_tags(data, topK=10, withWeight=True):

print('%s %s' % (keyword, weight))

復(fù)制代碼

下面我們嘗試另一種關(guān)鍵詞提取方式——TextRank。

for keyword, weight in textrank(data, withWeight=True):

print('%s %s' % (keyword, weight))

復(fù)制代碼

關(guān)鍵詞提取結(jié)果如下:

優(yōu)步 1.0

司機(jī) 0.749405996648

乘客 0.594284506457

姐姐 0.485458741991

天津 0.451113490366

目的地 0.429410027466

時(shí)候 0.418083863303

作者 0.416903838153

沒有 0.357764515052

活兒 0.291371566494

上車 0.277010013884

繞路 0.274608592084

轉(zhuǎn)載 0.271932903186

出來 0.242580745393

出租 0.238639889991

事兒 0.228700322713

單數(shù) 0.213450680366

出租車 0.212049665481

拉門 0.205816713637

跟著 0.20513470986

復(fù)制代碼

注意這次提取的結(jié)果,與TF-idf的結(jié)果有區(qū)別。至少,那個(gè)很突兀的“10”不見了。

但是,這是不是意味著TextRank方法一定優(yōu)于TF-idf呢?

這個(gè)問題,留作思考題,希望在你認(rèn)真閱讀了后面的原理部分之后,能夠獨(dú)立做出解答。

如果你只需要應(yīng)用本方法解決實(shí)際問題,那么請(qǐng)?zhí)^原理部分,直接看討論吧。

原理

我們簡(jiǎn)要講解一下,前文出現(xiàn)的2種不同關(guān)鍵詞提取方式——TF-idf和TextRank的基本原理。

為了不讓大家感到枯燥,這里咱們就不使用數(shù)學(xué)公式了。后文我會(huì)給出相關(guān)的資料鏈接。如果你對(duì)細(xì)節(jié)感興趣,歡迎按圖索驥,查閱學(xué)習(xí)。

先說TF-idf。

它的全稱是 Term Frequency - inverse document frequency。中間有個(gè)連字符,左右兩側(cè)各是一部分,共同結(jié)合起來,決定某個(gè)詞的重要程度。

第一部分,就是詞頻(Term Frequency),即某個(gè)詞語(yǔ)出現(xiàn)的頻率。

我們常說“重要的事說三遍”。

同樣的道理,某個(gè)詞語(yǔ)出現(xiàn)的次數(shù)多,也就說明這個(gè)詞語(yǔ)重要性可能會(huì)很高。

但是,這只是可能性,并不絕對(duì)。

例如現(xiàn)代漢語(yǔ)中的許多虛詞——“的,地,得”,古漢語(yǔ)中的許多句尾詞“之、乎、者、也、兮”,這些詞在文中可能出現(xiàn)許多次,但是它們顯然不是關(guān)鍵詞。

這就是為什么我們?cè)谂袛嚓P(guān)鍵詞的時(shí)候,需要第二部分(idf)配合。

逆文檔頻率(inverse document frequency)首先計(jì)算某個(gè)詞在各文檔中出現(xiàn)的頻率。假設(shè)一共有10篇文檔,其中某個(gè)詞A在其中10篇文章中都出先過,另一個(gè)詞B只在其中3篇文中出現(xiàn)。請(qǐng)問哪一個(gè)詞更關(guān)鍵?

給你一分鐘思考一下,然后繼續(xù)讀。

公布答案時(shí)間到。

答案是B更關(guān)鍵。

A可能就是虛詞,或者全部文檔共享的主題詞。而B只在3篇文檔中出現(xiàn),因此很有可能是個(gè)關(guān)鍵詞。

逆文檔頻率就是把這種文檔頻率取倒數(shù)。這樣第一部分和第二部分都是越高越好。二者都高,就很有可能是關(guān)鍵詞了。

TF-idf講完了,下面我們說說TextRank。

相對(duì)于TF-idf,TextRank要顯得更加復(fù)雜一些。它不是簡(jiǎn)單做加減乘除運(yùn)算,而是基于圖的計(jì)算。

下圖是原始文獻(xiàn)中的示例圖。

TextRank首先會(huì)提取詞匯,形成節(jié)點(diǎn);然后依據(jù)詞匯的關(guān)聯(lián),建立鏈接。

依照連接節(jié)點(diǎn)的多少,給每個(gè)節(jié)點(diǎn)賦予一個(gè)初始的權(quán)重?cái)?shù)值。

然后就開始迭代。

根據(jù)某個(gè)詞所連接所有詞匯的權(quán)重,重新計(jì)算該詞匯的權(quán)重,然后把重新計(jì)算的權(quán)重傳遞下去。直到這種變化達(dá)到均衡態(tài),權(quán)重?cái)?shù)值不再發(fā)生改變。這與Google的網(wǎng)頁(yè)排名算法PageRank,在思想上是一致的。

根據(jù)最后的權(quán)重值,取其中排列靠前的詞匯,作為關(guān)鍵詞提取結(jié)果。

如果你對(duì)原始文獻(xiàn)感興趣,請(qǐng)參考以下鏈接:

討論

小結(jié)一下,本文探討了如何用Python對(duì)中文文本做關(guān)鍵詞提取。具體而言,我們分別使用了TF-idf和TextRank方法,二者提取關(guān)鍵詞的結(jié)果可能會(huì)有區(qū)別。

你做過中文關(guān)鍵詞提取嗎?使用的是什么工具?它的效果如何?有沒有比本文更高效的方法?歡迎留言,把你的經(jīng)驗(yàn)和思考分享給大家,我們一起交流討論。

喜歡請(qǐng)點(diǎn)贊。還可以微信關(guān)注和置頂我的公眾號(hào)“玉樹芝蘭”(nkwangshuyi)。

如果你對(duì)數(shù)據(jù)科學(xué)感興趣,不妨閱讀我的系列教程索引貼《如何高效入門數(shù)據(jù)科學(xué)?》,里面還有更多的有趣問題及解法。

總結(jié)

以上是生活随笔為你收集整理的python中文模糊关键词提取_如何用Python提取中文关键词?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。