用 RAKE 和 Maui 做 NLP 關鍵詞提取的教程
Alyona 經營著一家總部在紐西蘭的 NLP 諮詢公司——Entopix,她有計算語言學碩士和計算機博士學位,是主題提取工具 Maui 的作者。
1 引言
在這個教程中,你將會學到如何用Python和Java自動提取關鍵詞,而且你將理解與之相關的任務,例如有控制詞表的關鍵短語提取(換句話說是把文字分類到各種可能類別的超大集合中),還有術語提取。
本教程如下組織:首先,我們討論要一點背景——什麼是關鍵詞,一個關鍵詞演算法如何工作?然後我們用一個叫做Rake的Python庫舉一個簡單但在很多情況下很有用的關鍵詞提取的例子。最後,我們展示一個叫做Maui的Java工具如何用機器學習方法提取關鍵詞。
1.1 為什麼提取關鍵詞
處理文件時,提取關鍵詞是最重要的工作之一。讀者受益於關鍵詞,因為他們可以快速判斷一篇文章是否值得一讀。網站創立者從中受益,因為他們可以根據話題集中相似的內容。演算法開發者從 關鍵詞受益,因為關鍵詞降低文字維度來顯出最重要的特徵。這只是一些有幫助的例子。
根據定義,關鍵詞是一篇文件中表達的主要話題。這個術語有點迷惑,所以下面的圖片在詞彙的源頭和被每個文件的話題數量方面比較了相關的任務。
這個教程中,我們會關注兩個具體的任務並且評價它們:
- 在給定文字中出現的最重要的詞和短語
- 從與給定文字匹配的預定詞表中,識別一系列主題
如何多個文件間詞彙一致性重要,我推薦你使用一個詞表——或學科詞表、分類詞典,除非由於某些原因做不到這點。
給對文字分類(另一個做文字工作時流行的任務)有興趣的人的幾句話:如果類別的數量很大,你將會很難收集足夠的訓練集用於有監督的分類。因此,如果有一百多個類別,並且你可以給出這些類別的名字(而不是抽象類別),那麼你面臨是細粒度的分類。我們可以把這個任務看作帶有受控詞彙表的關鍵詞提取,或者術語分配。所以,讀下去,這個教程也是針對你的!
2 關鍵詞提取如何工作?
通常關鍵詞提取演算法有三個主要成分:
- 候選詞選擇:這裡,我們提取所有可能是關鍵詞的詞,片語,術語或概念(取決於任務)。
- 特性計算:對於每個候選詞,我們需要計算表示它是否為關鍵詞的特性。比如,一個候選詞
- 對關鍵詞評分並選擇:所有候選詞可以通過把各性質結合進一個公式來評分,或者用機器學習技術來決定一個候選詞是一個關鍵詞的概率。然後一個分數或概率的閾值或者對關鍵詞數量的限制用來選擇最終的關鍵詞集合。
最終,像候選詞最小頻率的引數,它的最小和最大詞長,或者用來使候選詞標準化的詞幹提取器,都有助於調整演算法對於特定資料集的效能。
3 Python下用RAKE提取關鍵詞
對於Python使用者,有一個易用的關鍵詞提取庫叫做RAKE,其全稱是 Rapid Automatic Keyword Extraction。演算法本身表述在 Michael W. Berry的 《文字挖掘和理論》一書中(免費pdf)。這裡,我們使用已有的Python實現。這裡有個修改過的版本,它使用了自然語言處理工具NLTK處理一些計算。對於這個教程,我已經 fork了原始的RAKE倉庫並且將其拓展成了RAKE教程,來使用額外的引數評價它的效能。
3.1 配置RAKE
Shell1 | $git clonehttps://github.com/zelandiya/RAKE-tutorial |
然後,按照rake_tutorial.py中的步驟,import RAKE,並且為這個教程的”幕後”部分import operator:
Python12 | importrakeimportoperator |
3.2 對一小段文字使用RAKE
首先,我們用一個通向一個停止詞表的路徑初始化RAKE並且設定一些引數。
Python1 | rake_object=rake.Rake("SmartStoplist.txt",5,3,4) |
現在,我們有一個提取關鍵詞的RAKE物件,其中:
- 每個詞至少有5個字元
- 每個短語至少有3個詞
- 每個關鍵詞至少在文字中出現4次
這些引數取決與你手上的文字,並且仔細選擇這些引數是很關鍵的(試著用預設引數執行這個例子你就會明白)。更多資訊在下一節。
接下來,我們已經有了儲存在一個變數中的一段文字(在這個例子中,我們從一個檔案中讀取),我們可以應用RAKE並且列印關鍵詞。
Python1234 | sample_file=open("data/docs/fao_test/w2167e.txt",'r')text=sample_file.read()keywords=rake_object.run(text)print"Keywords:",keywords |
輸出應該看起來像這樣:
Python1 | Keywords:Keywords:[('household food security',7.711414565826329),('indigenous groups living',7.4),('national forest programmes',7.249539170506913),('wood forest products',6.844777265745007)... |
這裡,我們沒有每個關鍵詞的名字和它對應於這個演算法的分數。
3.3 RAKE: 幕後
這一次,我們將會使用一個短文字片段,並且我們可以在這裡使用預設引數:
Python12345678910 | stoppath="SmartStoplist.txt"rake_object=rake.Rake(stoppath)text="Compatibility of systems of linear constraints over the set of natural numbers. Criteria of compatibility "\"of a system of linear Diophantine equations, strict inequations, and nonstrict inequations are considered. "\"Upper bounds for components of a minimal set of solutions and algorithms of construction of minimal generating"\" sets of solutions for all types of systems are given. These criteria and the corresponding algorithms "\"for constructing a minimal supporting set of solutions can be used in solving all the considered types of "\"systems and systems of mixed types." |
首先,RAKE把文字分割成句子,並且生成候選詞:
Python123 | sentenceList=rake.split_sentences(text)stopwordpattern=rake.build_stop_word_regex(stoppath)phraseList=rake.generate_candidate_keywords(sentenceList,stopwordpattern) |
這裡,各種標點符號將會被認為句子邊界。大多數情況這都很有用,但是對於標點是真實短語的一部分的情況(例,.Net或Dr. Who)沒有用。
列在停止詞檔案中的所有詞將會被認為是短語邊界。這幫助我們生成包含一個或更多非停止詞的候選詞,比如這篇文字中的“compatibility”、“systems”、“linear constraints”、“set”,、“natural numbers”和“criteria”。大多數候選詞將會是有效的,但是,對於停止詞是短語的一部分的情況不會有用。例如,“new”列在RAKE的停止詞中。這意味著“New York”或“New Zealand”都不會是一個關鍵詞。
第二,RAKE 計算每個候選詞的屬性,是各候選詞的分數的總和。候選詞是怎麼打分的?根據候選詞的出現頻率,以及典型長度。
Python12 | wordscores=rake.calculate_word_scores(phraseList)keywordcandidates=rake.generate_candidate_keyword_scores(phraseList,wordscores) |
這裡的一個問題是,候選詞並沒有標準化。所有我們可能會有看起來完全一樣的關鍵詞,比如:「small scale production 和 small scale producers」,或者 「skim milk powder 和 skimmed milk powder」。在理想情況下,關鍵詞提取演算法應首先應用於詞幹和其他標準化的關鍵詞。
最後,我們根據RAKE的分數給候選關鍵詞排序。關鍵詞然後可以既是分數排名前五的候選詞,也可以是超過一個選定分數閾值的,或者排名第三的,如同下面的例子:
Python12345 | sortedKeywords=sorted(keywordcandidates.iteritems(),key=operator.itemgetter(1),reverse=True)totalKeywords=len(sortedKeywords)forkeywordinsortedKeywords[0:(totalKeywords/3)]:print"Keyword: ",keyword[0],", score: ",keyword[1] |
正常的輸出資訊如下:
Python12345678 | Keyword:minimal generating sets,score:8.66666666667Keyword:linear diophantine equations,score:8.5Keyword:minimal supporting set,score:7.66666666667Keyword:minimal set,score:4.66666666667Keyword:linear constraints,score:4.5Keyword:upper bounds,score:4.0Keyword:natural numbers,score:4.0Keyword:nonstrict inequations,score:4.0 |
這還有兩個有用的指令碼。第一個用有文件和他們的手工分分配的關鍵詞的目錄,和應該評價的排名靠前的關鍵詞的數量,評價了 RAKE 的準確度。例如:
Python123 | $python evaluate_rake.py data/docs/fao_test/10...Precision4.44Recall5.17F-Measure4.78 |
精度(Precision)告訴我們在這些被提取的關鍵詞中正確的百分比,回召(Recall)告訴我們在所有正確的關鍵詞中,正確提取的百分比,F量度是兩者的結合。
為了改善RAKE的效能,我們可以執行我為這個教程準備好的另一個指令碼。它迴圈運轉,每次使用不同的引數集,並且評估每次運轉的關鍵詞的質量。然後它返回在這個資料集上效能最好的引數。例如:
Python12345 | $python optimize_rake.py data/docs/fao_test/10Best result at5.56withmin_char_length3max_words_length5min_keyword_frequency6 |
這些值表示在這樣長的文件上,RAKE最好不包括超過5個詞的候選詞,並且只考慮出現少於6詞的候選詞。
總結一下,RAKE是一個簡單的關鍵詞提取庫,它主要解決找包含頻繁詞的多詞短語。它的強大之處在於它的易用性,它的缺點是它有限的準確度,引數配置的必須,還有它拋棄很多有效短語並且不歸一化候選詞。
4 用Java寫的Maui提取關鍵詞
Maui表示多用途自動主題索引。它是一個GPL許可用Java寫的庫,它的核心是機器學習工具包Weka。它是在多年的研究後,對關鍵詞提取演算法KEA的再現。跟RAKE相比,Maui支援:
- 不僅單從文字,還可以參照受控詞表,提取關鍵詞
- 通過用手工選擇的關鍵詞訓練Maui改善準確度
4.1 配置Maui
Maui的原始碼在Github和Maven Central可以下載,但是最簡單的方法是從Github下載Maui完整jar包,然後把jar複製到RAKE-tutorial工作目錄。
4.2 Mauti:從文字提取關鍵詞
為了比較,我們把Maui用於我們之前給RAKE使用的同一段文字。然而,因為Maui需要一個訓練模型,我們首先需要建立一個訓練模型。為了訓練Maui,我們執行下列命令:
1 | $java-Xmx1024m-jar maui-standalone-1.1-SNAPSHOT.jar train-ldata/docs/fao_train/-mdata/models/keyword_extraction_model-vnone-o2 |
這些引數解釋如下,train用來表明我們在訓練一個模型
- -I 表示文件和他們的手工關鍵詞的路徑
- -m 表示模型輸出路徑,
- -v none表示沒有詞表或者執行關鍵詞提取,
- -o 2 表示拋棄任何候選詞出現少於兩次的候選詞。
因為訓練目錄非常大,我相應增加了Java的堆空間。
一旦這個命令完成(它需要幾分鐘),我們就有了一個訓練模型並且我們可以把它用在我們的RAKE例子中的同樣文件,如下:
1 | $java-Xmx1024m-jar maui-standalone-1.1-SNAPSHOT.jar run data/docs/fao_test/w2167e.txt-mdata/models/keyword_extraction_model-vnone-n8 |
run命令既可以用於一個檔案路徑或者一個文字串。輸出應該像這樣:
Python12345678 | Keyword:food security0.4168253968253969Keyword:household0.361691628264209Keyword:food production0.3374377787854522Keyword:nutrition0.2319136508627857Keyword:household food security andnutrition0.21550774200419887Keyword:rural development0.1905299881996819Keyword:forest resources0.13882003874950102Keyword:trees0.13051174278199784 |
我們可以通過執行test命令評價關鍵詞質量,它會使用Maui內建的評價:
123456 | $java-Xmx1024m-jar maui-standalone-1.1-SNAPSHOT.jar test-ldata/docs/fao_test/-mdata/models/keyword_extraction_model-vnone-n8...INFO MauiTopicExtractor-Avg.number of correct keyphrases per document:2+/-1.03INFO MauiTopicExtractor-Precision:25+/-12.91INFO MauiTopicExtractor-Recall:26.16+/-15.07INFO MauiTopicExtractor-F-Measure:25.57 |
你可以得到顯著提升的效能,如果你在整個手工標註文件集上訓練Maui。但是確保從訓練集中去掉你用於測試的檔案。
如果你對用Maui提取術語有興趣,僅用提高概率閾值。然後記數一個文件集合中最常用的一些詞。
相關推薦
用 RAKE 和 Maui 做 NLP 關鍵詞提取的教程
Alyona 經營著一家總部在紐西蘭的 NLP 諮詢公司——Entopix,她有計算語言學碩士和計算機博士學位,是主題提取工具 Maui 的作者。 1 引言 在這個教程中,你將會學到如何用Python和Java自動提取關鍵詞,而且你將理解與之相關的任務,例如有控制詞表的關鍵短
用javascript和html5做一個音樂播放器,附帶源碼
功能 優化 str 自由 所有 音樂app 作者 弧形 ner 效果圖: 實現的功能 1、首頁 2、底部播放控件 3、播放頁面 4、播放列表 5、排行榜 6、音樂搜索 輸入搜索關鍵詞,點擊放大鏡圖標 7、側邊欄 目錄結構 開發心得與總結 1、輪播圖 首
用IDCNN和CRF做端到端的中文實體識別
矩陣 常見 ive learning 信息 loss rec iter 現在 實體識別和關系抽取是例如構建知識圖譜等上層自然語言處理應用的基礎。實體識別可以簡單理解為一個序列標註問題:給定一個句子,為句子序列中的每一個字做標註。因為同是序列標註問題,除去實體識別之外,相同的
RAKE 中文分詞 與 關鍵詞提取
import jieba import jieba.posseg as pseg import operator import json from collections import Counter # Data structure for holding data c
NLP----關鍵詞提取演算法(TextRank,TF/IDF)
參考書目:python自然語言處理實戰——核心技術與演算法 TF/IDF 基本思想:TF是計算一個詞在一篇文件中出現的頻率,IDF是一個詞在多少篇文件中出現過,顯然TF越高證明這個詞在這篇文章中的代表性就越強,而INF越低則證明這個詞在具有越強的區分能力。因此中和這兩個數
Yeoman官方教程:用Yeoman和AngularJS做Web應用
預計完成時間:60分鐘 在這期的Code Lab中,你將會使用Yeoman和AngularJS搭建一個功能完整的應用,示例應用將會簡短地介紹一些關於Yeoman、Grunt和Bower的特點。如果你有一些程式設計經驗的話,這期的CodeL Lab會很適合你。 認識Y
用sklearn和tensorflow做boston房價的迴歸計算的比較(3)--RNN之遞迴神經網路LSTM
在tensorflow裡RNN才是做迴歸計算的正規軍,其中LSTM更是讓人工智慧有了記憶,如果cnn最適合做的是影象識別,那麼LSTM就是視訊識別。網上的教程多是用正餘弦資料在做預測,輸入輸出都是一維,我這用波士頓房價,輸入是13個特徵! 注意與前面兩個模型不同的是,沒有用
用arduino和熱敏電阻做電子體溫計
因此又買了專門測體溫的熱敏電阻,某寶上有,型號是MEB-503E-3950 具體引數的解釋可以參考這篇文章: http://blog.sina.com.cn/s/blog_6182b82201012ii1.html 熱敏電阻計算公式 Rt = R *EXP(B*(1/T1-1/T2)) 對上式解釋如下:
用node.js和webpack做前後端分離的總結
調用 以及 定向 roc 目錄 加載 動靜 con 腳本 1.webpack打包的特點 (打包文件到指定地點,修改原文件裏的引用路徑為打包的地點) 涉及output的path/public path/dev-server裏的public path等概念 webpack的入
手把手 | 教你用幾行Python和消費資料做客戶細分
細分客戶群是向客戶提供個性化體驗的關鍵。它可以提供關於客戶行為、習慣與偏好的相關資訊,幫助企業提供量身定製的營銷活動從而改善客戶體驗。在業界人們往往把他吹噓成提高收入的萬能藥,但實際上這個操作並不複雜,本文就將帶你用簡單的程式碼實現這一專案。 客戶
手把手 教你用幾行Python和消費資料做客戶細分
細分客戶群是向客戶提供個性化體驗的關鍵。它可以提供關於客戶行為、習慣與偏好的相關資訊,幫助企業提供量身定製的營銷活動從而改善客戶體驗。在業界人們往往把他吹噓成提高收入的萬能藥,但實際上這個操作並不複雜,本文就將帶你用簡單的程式碼實現這一專案。 我們需要建立什麼?
用HttpClient和用HttpURLConnection做爬蟲發現爬取的程式碼少了的問題
最近在學習用java來做爬蟲但是發現不管用那種方式都是爬取的程式碼比網頁的原始碼少了很多在網上查了很多都說是inputStream的緩衝區太小而爬取的網頁太大導致讀取出來的網頁程式碼不完整,但是後面發現並不是這個問這個是用HttoClient所作的public static String getH
[NLP技術]關鍵詞提取演算法實現
實現程式碼: var nodejieba = require("nodejieba"); var fs = require('fs'); var topN = 100; var result; var data = fs.readFileSync('t.txt
用Arduino和藍芽模組做一個開門裝置
用Arduino和藍芽模組做一個開門裝置 閒來無事,給門上裝一個不用鑰匙開門的裝置(如圖) 學校很老的鎖也搞不出什麼花樣了,就拿個舵機拉根杜邦線拽著鎖。 很簡單的東西,做著玩玩。(好吧,我承認看著有點’低電平‘) 用的好像是HC04藍芽模組吧,就網上賣的Arduino套間裡的那個
[NLP技術]關鍵詞提取演算法-TextRank
關鍵詞提取演算法-TextRank 今天要介紹的TextRank是一種用來做關鍵詞提取的演算法,也可以用於提取短語和自動摘要。因為TextRank是基於PageRank的,所以首先簡要介紹下PageRank演算法。 1.PageRank演算法
leetcode——用位運算來做2的冪次方和位元位計數問題
231.給定一個整數,編寫一個函式來判斷它是否是 2 的冪次方。 示例 1: 輸入: 1 輸出: true 解釋: 20 = 1 示例 2: 輸入: 16 輸出: true 解釋: 24 = 16 示例 3: 輸入: 218 輸出: false 思路: 可以用mod去
在visual studio 2017下用xamarin for android 做個簡單的註冊頁面,包含單選控制元件,多選控制元件和下拉選單控制元件
照著牛腩老師的視訊,自己做了個註冊頁面,實現了簡單的單選控制元件、多選控制元件、下拉選單控制元件的使用,由於日曆控制元件太醜,就不模仿了,下面就是reg.axml的佈局效果,後面是程式碼。 , <?xml version="1.0" encoding="utf-8"?
關鍵詞提取方法學習總結(TF-IDF、Topic-model、RAKE)
關鍵詞是一篇文件中表達的主要話題,處理文件或句子時,提取關鍵詞是最重要的工作之一,這在NLP中也是一個十分有用的task。 常見的關鍵詞提取方法有:TF-IDF關鍵詞提取方法、Topic-model關鍵詞提取方法和RAKE關鍵詞提取。 TF-IDF: 使用TF-IDF提取
教你用認知和人性來做最棒的程序員
清晰 公共函數 最重要的 財報 易懂 one 很好 測試的 phone 不久前,在團隊內部和大家做了一次分享,內容就是這次要講的“用認知和人性來提升自己的技術水平”,大家反響不錯,所以這次整理一下也分享給大家。最初我是想用“借優秀的產品經理思維來做最棒程序員”的這個標題,但
【騰訊TMQ】【測試左移專欄】用Powermock和Mockito來做安卓單元測試
作者:ZeusL 團隊:騰訊移動品質中心TMQ 一、單元測試及Android單元測試簡介 慣例,先簡單介紹下理論知識,懂得的可以跳過。 1、單元測試定義和特性 單測定義: 在計算機程式設計中,單元測試(Unit Testing)又稱為模組測試,