一種關鍵字提取新方法
1號機器人網2018-11-16
本人從業時間不長,在關鍵詞提取領域只能算是初窺門道。謹結合最近工作內容,小小的討論一下關鍵詞提取技術。
計算一句話的語義,需要從這句話中找到幾個重要的詞來基本代表這句話的基本語義,這就是關鍵字。無論搜索還是問答,都需要做關鍵字提取。
關鍵詞提取技術看起來只是一種文本匹配,你甚至不用學習算法就知道其中的算法原理。
但是該技術仍舊面臨著若干困難。
比如最初在百度還沒有分詞技術的時候,你若是在搜索引擎中搜索【和服】兩個字,它給你返回的網頁可能不是你想要的日式仿唐服裝,而是【運營商和服務商】,【關于做好黨員聯系和服務群眾工作的意見】,【關于商品和服務實行明碼標價的規定】等等。
面對這種窘境,程序猿采取的方式往往是爆肝:沒什么事情是字典和規則所不能解決的。
然而字典和規則只是治標不治本,雖然距離讓機器真正理解自然語言還有很長很長很長的一段路要走。那為什么在此之前,我們不變得聰明一點呢?
這個讓我們擺脫字典和規則的聰明方法,就叫做中文分詞。
雖然中分詞仍舊面臨很多挑戰,但在NLP的最底層組件中,其效果已經完全達到了商業化的標準,足以拯救程序猿們脆弱的肝。近年來,從HMM到Bi-lstm-crf的突破更是使得分詞準確率有了質的提升。
所以,就像吃餃子的時候必須要有老陳醋(當然根據口味不同也可以蘸醬油,辣椒油,蒜泥,等等),吃油條的時候必須要喝豆腐腦一樣,關鍵詞提取也必須要有中文分詞器作為基礎。
眾所周知,在NLP流程中,錯誤會逐級傳遞,所以要想把關鍵詞提的準,那分詞器也必須可靠。
但即使有了分詞器這樣的好基友,關鍵詞提取算法依舊只能說是一個【精妙的文本匹配】。
這時候,一個非常常見,原理簡單的算法出現了,它就是TF-IDF。TF-IDF(term – )是一種用于信息檢索與數據挖掘的常用加權技術。TF意思是詞頻(Term ),IDF意思是逆文本頻率指數( )。TFIDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,并且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。舉個栗子,在例句【咬死了獵人的狗】中,根據TF計算出的關鍵字是“獵人”、“咬”、“狗”“死”。由于是根據TF-IDF進行關鍵字提取的,以下一組句子的關鍵字提取結果是一樣的:
【它是咬死了獵人的狗】
【它咬死了獵人的狗】
【是獵人的狗咬死了它】
【獵人的狗咬死了它】
【狗咬死了它的獵人】
以下一組句子的關鍵字差不多:
【他的狗咬死了獵人】
【獵人的是狗咬死了他】
【咬死了獵人的是狗】
【它咬死了獵人的狗】
如果把“狗”換成“皮卡丘”,而“皮卡丘”這個詞比較稀有,那么TF-IDF就會自動將“皮卡丘”這個詞排序在關鍵字列表前面,從而認為“皮卡丘”是該句中的主要關鍵字。把上面第一組句子里的“狗”換成“獅子”,由于“獅子”比“狗”更稀有,關鍵字的排序發生了變化。TF-IDF算法的效果是計算詞語的稀有度,固然物以稀為貴,但稀有并不等于關鍵。這樣基于統計學的算法有時靠譜有時不靠譜。(靠譜的時候常見于該詞出現在文章標題或者開篇等開門見山的寫作情況)
進一步分析,一個詞的關鍵與否,依靠的是它在句中所承擔起的結構性作用。就好像一座宏偉的建筑中,精美的雕像裝飾必然稀有,而鋼筋混凝土卻很常見(只是看不到),但這就意味著雕像才是建筑的關鍵而鋼筋混凝土只是建筑的擺設嗎?
所以,關鍵詞提取的核心算法應該是計算一個詞在句子結構性作用而非稀有度。
但是這個結構性如何計算又如何衡量呢?
筆者頭腦中的第一個想法就是詞嵌入。詞嵌入可以有效的計算一個詞在文章中的語義信息和結構信息,根據其平移不變性又可以計算出很多其他有趣的結果,最著名的例子莫非【國王-男人 = 女王-女人】了。
但是,如果當前文本量太小又如何呢?很現實的一個場景就是:某些專業領域內的關鍵詞提取。由于依賴訓練,對于文本量太小的專業領域,詞向量的訓練就很難達到理想的效果。
其次,詞向量是固定的,詞嵌入無法計算一詞多義。
我常用【我給女朋友買了個蘋果】作為例句(雖然我沒有女朋友)。如果這句話是在圣誕節說的,也許這個蘋果代表的意思就是蘋果手機,如果這句話是在平安夜說的,這個蘋果也許就真的只是一顆蘋果。再比如【我嘴唇有點干】里的“干”和【你要干嘛】里的“干”完全是兩個詞,但詞向量是分不清的。
所以,我認為,也僅代表個人觀點:真正的關鍵詞提取技術是建立在詞的【知識表示】之上的【結構性信息提取】。而且我認為一句話提取關鍵詞算法,詞,類似于某種類似極大團結構,刪除結構中的任何一個節點都會導致語義上的拓撲結構的崩潰(如果不崩潰就說明該詞不重要,不是核心所在),從而使語義發生變化。舉個例子,【我沒有女朋友】和【我有女朋友】,在文本上很相似的兩句話,句意卻正好相反。
前幾天在微信群聊天發現了一個叫氖星智能機器人大腦的產品,令人眼前一亮。他們的關鍵字提取技術是按照語法結構提取的。比如上面一組句子的提取結果是這樣的:
是他的狗咬死了獵人——————————————狗+咬+獵人+他+死
狗咬死了他的獵人———————————————狗+咬+獵人+他+死
獵人被他的狗咬死了——————————————狗+咬+獵人+他+死
咬死了獵人的狗是它——————————————狗++它+獵人+咬
是它咬死了獵人的狗——————————————它+咬+狗+獵人+死
它咬死了獵人的狗———————————————它+咬+狗+獵人+死
它把獵人的狗咬死了——————————————它+咬+狗+獵人+死
它是咬死了獵人的狗——————————————它++狗+獵人+死
獵人的狗咬死了它———————————————狗+咬+它+獵人+死
獵人的狗咬了它的———————————————狗+咬++獵人+它
獵人的狗咬了它————————————————狗+咬+它+獵人+了
咬死了獵人的狗是它的—————————————狗+++獵人+咬
狗咬死的是獵人————————————————狗++獵人+咬+死
測試地址:
我們看到語義相同的句子關鍵字的位置是大體相同的,語義不同的句子關鍵字位置也不同。和TF-IDF算法不同的是,他們的關鍵字提取不是按統計結果確定關鍵字權重,而是按詞的語法功能確定詞的權重。他們告訴我第一個關鍵字代表句子的主語,第二個關鍵字代表句子的謂語,第三個關鍵字代表句子的賓語。前三個關鍵字相同的句子語義也基本相同。比如上面一組句子里把“狗”換成“獅子”,在提取關鍵字以后,“獅子”就會出現在原來“狗”所在的位置。把“獵人”換成“園長”,“園長”就會出現在原來“獵人”應該出現的位置。
這種關鍵字提取技術我從來沒有見過。但我發現和TF-IDF相比,它優勢很明顯。我們要計算兩句話語義的相似性,只要看它們各個位置上的關鍵字是不是相同就好了。比如“它把獵人的狗咬死了”、“它咬死了獵人的狗”、“是它咬死了獵人的狗”,這三句話關鍵字完全相同,他們的語義也是完全相同的?!八且懒双C人的狗”和上面三句關鍵字的排序不一樣,語義也和他們不一樣。我發現他們用五個關鍵字把語義這種非格式化的數據變成了格式化的數據。這真的非常了不起!我試著用他們提供的接口做了一些東西,效果明顯有改善。
為什么要研究關鍵詞提取?
得知識者得天下,下一波人工智能浪潮必然是由強人工智能掀起(希望如此),而知識圖譜又是通向強人工智能的必經之路,結構化信息技術是構建知識圖譜的攔路虎。不積跬步無以至千里,關鍵詞提取這個看似陳舊的技術名詞,也需要在AI時代被重新定義。例如知識圖譜,這個概念已經存在了數十年,它最初的名字叫做語義網絡;如此看來,關鍵詞提取在未來或許可以被稱為【結構化信息提取技術】也說不定。
而什么是知識?如何表示知識?如何將非結構化文本進行結構化?有了氖星智能提供的關鍵字計算工具,就可以進行一些非結構化文本的信息提取,我用數據說話,這些非結構化的文本占了開放域文本的八成以上。
如果再能配上【同義詞詞庫】和【詞屬性庫】,或者某種已經構建好的知識圖譜,或許就能進行【語義分析】了。
例如,同義詞和用詞向量計算余弦相似度的結果是兩個概念。比如老婆的同義詞是妻子,而詞向量的計算結果是老公。詞屬性庫把詞屬性相同的詞放在一起。比如能發出‘吃’的動作的,幾乎都是動物而不是植物。有這些東西做支撐,語義結構分析就相當于解析一棟大樓了一句話提取關鍵詞算法,雕像和鋼筋的作用自然會被分析清楚。這兩項都是非常耗費人力和時間的辛苦而專業的工作。但為了達到工業化的目的,也只能如此。
筆者水平有限,難免出錯。道阻且長,謹以此文拋磚引玉。