京东搜索框的汉语分词技术太牛了!!!---------js的番外拓展 (二)
系列文章目錄
JS的垃圾回收機制-----------------------------js的番外拓展 (一)
https://blog.csdn.net/weixin_44070254/article/details/116245572?spm=1001.2014.3001.5501
文章目錄
- 系列文章目錄
- 前言
- 一、分詞涉及的主要問題 ?
- 1. 核心詞表問題
- 2.詞的變形問題
- 3.詞綴的問題
- 4.不同目標的應用
- 二、基于詞典和規則的漢字分詞分類
- 1 基于詞典和規則的漢字分詞
- 1.1 最大匹配分詞方法
- 1.2 全切分分詞算法
- 1.3 基于理解的中文分詞算法
- 2.1 N元語法(N-gram)模型和隱馬爾可夫模型(HMM)
- 2.2 互信息模型
- 2.3 最大熵模型
- 3 規則和統計方法相結合的漢字分詞方法
- 三、常用中文分詞包
- 總結
前言
中文分詞的技術是怎樣實現的?例如有一段文字“吃虧不要緊,只要主義真”,雙擊“吃”字,會自動選中“吃虧”。我想問的就是系統怎么知道這兩個字構成一個詞?京東的分詞還是非常牛的,支持漢語拼音分詞、簡拼分詞、英語分詞、數詞分詞,太厲害了。
比如我這樣搜索:
當搜索一個名詞時,下面的提示框會提示相關的不同名詞。
但是當我輸入拼音的時候,看清楚了:
它自己給拼音進行了解析,提示框也給出了相關的提示,是不是很神奇呢,太牛了吧。那這背后到底是怎么樣的算法實現呢?
我忍不住去翻閱了相關資料和問了度娘,這篇博客帶你們見識一下這個神奇的算法吧。
在中文自然語言處理中,詞是最小的能夠獨立活動的有意義的語言成分。漢語是以字為基本書寫單位,詞語之間沒有明顯的區分標記,因此進行中文自然語言處理通常是先將漢語文本中的字符串切分成合理的詞語序列,然后再在此基礎上進行其它分析處理。中文分詞是中文信息處理的一個基礎環節,已被廣泛應用于中文文本處理、信息提取、文本挖掘等應用中。分詞涉及許多方面的問題,主要包括:
一、分詞涉及的主要問題 ?
1. 核心詞表問題
?????? ?許多分詞算法都需要有一個核心的(通用、與領域無關的)詞表。凡在該詞表中的詞,分詞時就應該切分出來。但對于哪些詞應當收進核心詞表,目前尚無一個標準;2.詞的變形問題
?????? ?漢語中的動詞和形容詞有些可以產生變形結構,如“打牌”、“開心”、“看見”、“相信”可能變形成“打打牌”、“開開心”、“看沒看見”、“相不相信”等,它們可以被切出“打打/牌”,但“開開/心”就不合理;“看/沒/看見”說得過去,“相/不/相信”就說不過去。又如大量的離合詞如“打架”、“睡覺”等可以合理地變形為“打了一場架”、“睡了一大覺”。對這些變形結構的切分往往缺少可操作而又合理的規范;
3.詞綴的問題
?????? ?如語素“者”在現代漢語中單用是沒有意義的,因此“作者”、“成功者”、“開發者”內部不能切開。依據這個標準,如“作出了巨大個人財產和精神犧牲者”、“克服許多困難而最終獲得成功者”、“開發中國第一個操作系統軟件者”也不能切開,但這樣復雜的結構與詞的定義相矛盾。又如職務名稱“教育局長”,語義上理解為“教育局之長”,但切成“教育/局長”、“教育局/長”、“教育/局/長”或不予切分,都會有人提出異議。
4.不同目標的應用
?????? ?比如以詞為單位的鍵盤輸入系統為了提高輸入速度,一些互現頻率高的相互鄰接的幾個字也常作為輸入單位,如“這是”、“每一”、“并不”、“不多”、“不在”、“就是”、“也就”等;檢索系統中,檢索系統的詞庫注重術語和專名,且多數檢索系統傾向于分詞單位小型化,比如把“中國科學院”切成“中國/科學院”,使得無論用“中國科學院”還是用“科學院”檢索,系統都能查到,提高查全率;在校對系統中往往將含有易錯字的詞和詞組作為詞單位,如許多人“作”、“做”分不清,計算機自動判別時,若把它們當作單字詞也不好區分,但在同前后文構成的詞或詞組中往往可以有確定的選擇,故應把有關的詞和詞組都收進詞庫,如“敢做”、“敢作敢為”、“叫做”、“做出”、“看作”、“做為”等,而校對系統要求分詞單位較大,如把“勇斗”、“力擒”、“智取”等分別作為一個分詞單位并劃歸及物動詞參與上下文檢查,“張老師”、“五分之三”、“北京中醫學院”也應分別作為分詞單位,并分別歸類作為人、數字、機構名,再參與上下文檢查。
二、基于詞典和規則的漢字分詞分類
1 基于詞典和規則的漢字分詞
1.1 最大匹配分詞方法
?????? ?最大匹配分詞方法又分正向最大匹配、反向最大匹配和雙向最大匹配方法。正向最大匹配從左到右每次取最長詞;反向最大匹配每次是從右到左取最長詞;雙向匹配則是進行正向、反向匹配,然后對于兩種匹配結果不同的地方再利用一定的規則進行消歧。
最大匹配法可能無法處理部分覆蓋歧義、交叉歧義。但這種方法實現簡單且切分速度快。
1.2 全切分分詞算法
?????? ?利用詞典匹配,獲得一個句子所有可能的切分結果。由于全切分的結果數隨著句子長度的增加呈指數增長,因此這種方法的時空開銷大;對于比較長且包含較多歧義的句子,往往要經過很長時間才能遍歷完所有的切分路徑。
1.3 基于理解的中文分詞算法
?????? ?分詞中歧義消除的過程是一個理解的過程,這不僅需要詞法信息,還需要句法和語義信息。所以目前也有些研究者嘗試模擬人的理解過程,在分詞過程中加入句法和語義分析來處理歧義問題。由于漢語語言知識的復雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基于理解的分詞系統還處在試驗階段。
## 2 基于大規模語料庫的統計學習的分詞方法 ?????? ?這類方法主要是利用從大規模語料庫中通過統計得到的各種概率信息,來對中文字符串進行切分。這種方法往往不需人工維護規則,也不需復雜的語言學知識,且擴展性較好,是現今分詞算法中較常用的做法。除最常見的詞頻統計信息以外,目前常用的模型有:
2.1 N元語法(N-gram)模型和隱馬爾可夫模型(HMM)
在N元語法中,一個句子可以看成一個連續的字符串序列,它可以是單字序列,也可以是詞序列。一個句子W1W2…Wk的出現概率用P(W)表示,則:
2.2 互信息模型
互信息用來表示兩個字之間結合的強度,其公式為:
MI值越大,表示兩個字之間的結合越緊密(如“尷尬”、“匍匐”等詞)。反之,斷開的可能性越大。當兩個詞x與y關系強時,MI(x , y )>= 0;x與y關系弱時,MI (x , y )≈0;而當MI(x , y )< 0時,x與y稱為“互補分布”。
2.3 最大熵模型
?????? ?最大熵模型的作用是在已知條件下選擇一個合適的分布來預測可能出現的事件,其主要思想是在只掌握關于未知分布的部分知識時,應選取符合這些知識但熵值最大的概率分布。式中,S在實驗結束前是實驗結果不確定性的度量,實驗完成后是從實驗中獲得的信息量。S越大表明不確定性越大,實驗結束后從中得到的信息量也越大。
3 規則和統計方法相結合的漢字分詞方法
?????? ?現在多數分詞算法都采用規則和統計相結合的方法,這樣做既可降低統計對語料庫的依賴性,充分利用已有的詞法信息,同時又能彌補規則方法的不足。常用的結合方法是利用詞典進行初切分,然后用其它的概率統計方法和簡單規則消歧來進行未登錄詞識別。比如,ICTCLAS分詞法利用詞典匹配進行初切分得到一個切分詞圖,然后利用詞頻信息求詞圖N條最短路徑的N-最短路徑法。還有些研究者利用詞典找出所有的交叉歧義,然后利用Bigram語言模型或其變形來消除歧義。
?????? ?以上內容引用北京理工大學大數據搜索與挖掘實驗室張華平主任著作《大數據搜索與挖掘》一書,大家如果感興趣可以查找閱讀一下,或受益匪淺。同時張華平主任的研究成果NLPIR大數據語義智能系統,大家也可以了解一下,NLPIR大數據語義智能分析平臺是根據中文數據挖掘的綜合需求,融合了網絡精準采集、自然語言理解、文本挖掘和語義搜索的研究成果,并針對互聯網內容處理的全技術鏈條的共享開發平臺。
三、常用中文分詞包
庖丁解牛分詞包,適用于與Lucene整合。http://www.oschina.net/p/paoding
?????? ?庖丁中文分詞庫是一個使用Java開發的,可結合到Lucene應用中的,為互聯網、企業內部網使用的中文搜索引擎分詞組件。
?????? ? Paoding填補了國內中文分詞方面開源組件的空白,致力于此并希翼成為互聯網網站首選的中文分詞開源組件。 Paoding中文分詞追求分詞的高效率和用戶良好體驗。
Paoding’s Knives 中文分詞具有極 高效率 和 高擴展性 。引入隱喻,采用完全的面向對象設計,構思先進。
高效率:在PIII 1G內存個人機器上,1秒 可準確分詞 100萬 漢字。
采用基于 不限制個數的詞典文件對文章進行有效切分,使能夠將對詞匯分類定義。
能夠對未知的詞匯進行合理解析
LingPipe,開源自然語言處理的Java開源工具包。http:/alias-i.com/lingpipe/
功能非常強大,最重要的是文檔超級詳細,每個模型甚至連參考論文都列出來了,不僅使用方便,也非常適合模型的學習。
?????? ?主題分類(Top Classification)、命名實體識別(Named Entity Recognition)、詞性標注(Part-of Speech Tagging)、句題檢測(Sentence Detection)、查詢拼寫檢查(Query Spell Checking)、興趣短語檢測(Interseting Phrase Detection)、聚類(Clustering)、字符語言建模(Character Language Modeling)、醫學文獻下載/解析/索引(MEDLINE Download, Parsing and Indexing)、數據庫文本挖掘(Database Text Mining)、中文分詞(Chinese Word Segmentation)、情感分析(Sentiment Analysis)、語言辨別(Language Identification)等
JE分詞包
LibMMSeg http://www.oschina.net/p/libmmseg
采用C++開發,同時支持Linux平臺和Windows平臺,切分速度大約在300K/s(PM-1.2G),截至當前版本(0.7.1)。
LibMMSeg沒有為速度仔細優化過,進一步的提升切分速度應仍有空間。
IKAnalyzer http://www.oschina.net/p/ikanalyzer
IKAnalyzer基于lucene2.0版本API開發,實現了以詞典分詞為基礎的正反向全切分算法,是LuceneAnalyzer接口的實現。
?????? ? 該算法適合與互聯網用戶的搜索習慣和企業知識庫檢索,用戶可以用句子中涵蓋的中文詞匯搜索,如用"人民"搜索含"人民幣"的文章,這是大部分用戶的搜索思維;
不適合用于知識挖掘和網絡爬蟲技術,全切分法容易造成知識歧義,因為在語義學上"人民"和"人民幣"是完全搭不上關系的。
PHPCWS http://www.oschina.net/p/phpcws
PHPCWS 是一款開源的PHP中文分詞擴展,目前僅支持Linux/Unix系統。
?????? ? PHPCWS 先使用“ICTCLAS 3.0 共享版中文分詞算法”的API進行初次分詞處理,再使用自行編寫的“逆向最大匹配算法”對分詞和進行詞語合并處理,并增加標點符號過濾功能,得出分詞結果。
?????? ? ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中國科學院計算技術研究所在多年研究工作積累的基礎上,基于多層隱馬模型研制出的漢語詞法分析系統,主要功能包括中文分詞;詞性標注;命名實體識別;新詞識別;同時支持用戶詞典。ICTCLAS經過五年精心打造,內核升級6次,目前已經升級到了ICTCLAS3.0,分詞精度 98.45%,各種詞典數據壓縮后不到3M。ICTCLAS在國內973專家組組織的評測中活動獲得了第一名,在第一屆國際中文處理研究機構SigHan 組織的評測中都獲得了多項第一名,是當前世界上最好的漢語詞法分析器。
?????? ? ICTCLAS 3.0 商業版是收費的,而免費提供的 ICTCLAS 3.0 共享版不開源,詞庫是根據人民日報一個月的語料得出的,很多詞語不存在。所以本人對ICTCLAS分詞后的結果,再采用逆向最大匹配算法,根據自己補充的一個9萬條詞語的自定義詞庫(與ICTCLAS詞庫中的詞語不重復),對ICTCLAS分詞結果進行合并處理,輸出最終分詞結果。
?????? ? 由于 ICTCLAS 3.0 共享版只支持GBK編碼,因此,如果是UTF-8編碼的字符串,可以先用PHP的iconv函數轉換成GBK編碼,再用phpcws_split函數進行分詞處理,最后轉換回UTF-8編碼。
7、KTDictSeg 一個C#.net做的簡單快速準確的開源中文分詞組件(這個分詞算法效果也不錯)
總結
JS的垃圾回收機制-----------------------------js的番外拓展 (一)
https://blog.csdn.net/weixin_44070254/article/details/116245572?spm=1001.2014.3001.5501
總結
以上是生活随笔為你收集整理的京东搜索框的汉语分词技术太牛了!!!---------js的番外拓展 (二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: langid 代码对应的语种名
- 下一篇: 04 Xcp 标定过程介绍