百億級數(shù)據(jù)搜索引擎决摧,Lucene亿蒸,其當(dāng)中的分詞原理究竟是怎樣的?

前情提要

關(guān)于搜索引擎的知識掌桩,在這里是連載的文章边锁,大家觀看文章,如果看不懂或者不理解波岛,一方面的話可以在留言區(qū)進(jìn)行技術(shù)留言茅坛,我將和大家一起探討相關(guān)技術(shù)點;另一方面則是關(guān)注相關(guān)的Lucene專題则拷,后續(xù)會慢慢贡蓖,循序漸進(jìn)的幫助大家解讀相關(guān)的技術(shù)點!

Lucene有關(guān)java的sdk依賴包

上篇文章中沒有給大家放Lucene有關(guān)java開發(fā)的依賴包煌茬,這里給大家補(bǔ)充上去摩梧,大家選取可以按照原理自行練習(xí)。由于Lucene不需要安裝宣旱,應(yīng)用起來也是比較簡單的仅父!

<properties>
  <java.version>1.8</java.version>   <!--規(guī)定最低jdk版本1.8-->
  <lucene.version>7.7.0</lucene.version><!--本次Lucene選取7.7.0的依賴-->
</properties>

<dependencies>
  <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>${lucene.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-analyzers-common</artifactId>
    <version>${lucene.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queries</artifactId>
    <version>${lucene.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queryparser</artifactId>
    <version>${lucene.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-analyzers-smartcn</artifactId>
    <version>${lucene.version}</version>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

今天和大家主要研究Lucene的分詞相關(guān)的知識點以及原理!

分詞算法概述

詞是表達(dá)語言的最小單位浑吟。分詞對搜索引擎很重要笙纤,可以幫助搜索引擎自動識別語句含義,使搜索結(jié)果匹配度達(dá)到最高组力,因此分詞質(zhì)量的好壞也就影響了搜索結(jié)果的精度省容。利用分詞器,把短語或者句子切分成分詞燎字,才能保證搜索的質(zhì)量和結(jié)果腥椒。

英文分詞原理
基本流程:輸入文本阿宅、詞匯分割、詞匯過濾(去Stop Word)笼蛛、詞干提热鞣拧(形態(tài)還原)、大寫轉(zhuǎn)換滨砍,輸出結(jié)果往湿。

中文分詞原理
中文分詞比較復(fù)雜,因為中文句子中沒有像英文中天然的空格來分隔惋戏。所以领追,中文分詞主要有3種方法:
1.基于詞典匹配
2.基于詞頻統(tǒng)計
3.基于詞頻統(tǒng)計

基于詞典統(tǒng)計

該算法實際上就是把一個句子從左向右掃描一遍,遇見字典中有的詞就標(biāo)記出來响逢,遇到復(fù)合詞就找到最長的詞匹配绒窑,遇到不認(rèn)識的詞就切分城單個詞。按照匹配掃描方向不同舔亭,又分為:
1.正向最大匹配
2.逆向最大匹配
3.最少切分
真正實用的分詞系統(tǒng)些膨,都會把字典作為基礎(chǔ)手段,再結(jié)合該語言自身的其他特征來提高切分的質(zhì)量和精度分歇。

基于詞頻統(tǒng)計

該算法的原理是:在中文文章中傀蓉,相鄰的字搭配出現(xiàn)的頻率越高欧漱,就越有可能形成一個固定的詞职抡。根據(jù)兩個字的統(tǒng)計信息,計算兩個漢字的相鄰共現(xiàn)概率误甚,統(tǒng)計出來的結(jié)果體現(xiàn)漢字之間的緊密程度缚甩,當(dāng)緊密程度高于某個閾值,便可認(rèn)為該組合可能構(gòu)成一個詞窑邦。
基于詞頻統(tǒng)計的分詞方法只需要對語料中的漢字組合頻度進(jìn)行統(tǒng)計擅威,不需要詞典,因此又叫做無詞典分詞或者統(tǒng)計分詞法冈钦。

基于語義理解

基于語義理解的分詞是模擬人腦對語言和句子的理解郊丛,達(dá)到識別句子的效果。

Trie樹(字典樹)

Trie樹瞧筛,又稱字典樹厉熟,單詞查找樹或者前綴樹,是一種用于快速檢索的多叉樹結(jié)構(gòu)较幌,如英文字母的字典樹是一個26叉樹揍瑟,數(shù)字的字典樹是一個10叉樹。它是一種哈希樹的變種乍炉。典型應(yīng)用是用于統(tǒng)計绢片,排序和保存大量的字符串(但不僅限于字符串)滤馍,所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計。它的優(yōu)點是:利用字符串的公共前綴來減少查詢時間底循,最大限度地減少無謂的字符串比較巢株,查詢效率比哈希樹高。
1.根節(jié)點不包含字符此叠,除根節(jié)點外每一個節(jié)點都只包含一個字符纯续。
2.從根節(jié)點到某一節(jié)點,路徑上經(jīng)過的字符連接起來灭袁,為該節(jié)點對應(yīng)的字符串猬错。
3.每個節(jié)點的所有子節(jié)點包含的字符都不相同。

Lucene分詞器

索引和查詢都是以詞為基本單詞茸歧。在Lucene中分詞主要依靠Analyzer類解析實現(xiàn)倦炒。Analyzer內(nèi)部主要通過TokenStream來實現(xiàn),Tokenizer和TokenFilter是Tokan的兩個子類软瞎。Tokenizer處理單個字符組成的字符流逢唤,讀取Reader對象中的數(shù)據(jù),處理后轉(zhuǎn)換城詞元涤浇。TokenFilter完成文本過濾功能鳖藕。
StopAnalyzer
停用詞分詞器。過濾詞匯中的特定字符串和詞匯只锭,并完成大寫轉(zhuǎn)小寫的功能著恩。
StandardAnalyzer
根據(jù)空格和符號來完成分詞,還可以完成數(shù)字蜻展、字母喉誊、Email地址、IP地址及中文字符的分析處理纵顾,還可以支持過濾詞表伍茄,用來替代StopAnalyzer的過濾功能。
WhitespaceAnalyzer
使用空格作為間隔的分割分詞器施逾。處理時敷矫,以空格作為分隔符號。分詞器不做詞匯過濾汉额,也不進(jìn)行大小寫字符轉(zhuǎn)換曹仗,主要用來特定環(huán)境下的英文符號處理。不需要字典支持闷愤。
SimpleAnalyzer
處理時整葡,以非字母字符作為分隔符號。分詞器不做詞匯過濾讥脐,值進(jìn)行分析和分割遭居。輸出的結(jié)果完成大小寫轉(zhuǎn)換啼器,去標(biāo)點符號。不支持中文俱萍。不需要字典支持端壳。
CJKAnalyzer
內(nèi)部調(diào)用CJKTokenizer分詞器,對中文進(jìn)行分詞枪蘑,同時使用StopFilter完成過濾损谦。
KeywordAnalyzer
把整個輸入作為一個單獨次元,方便特殊文本索引和搜索岳颇。主要針對ZipCode照捡、Address等表示特定語義的信息。

中文分詞器

SmartChineseAnalyzer
運用概率知識话侧,對中英文混合的文本進(jìn)行分詞操作栗精,先將文本進(jìn)行分句,再分別對每句話進(jìn)行分詞瞻鹏。這個分詞器是基于隱馬爾科夫模型而設(shè)計的悲立,并使用了大量的語料進(jìn)行中文詞頻的統(tǒng)計呜达,同時包含了來自 ICTCLAS1.0的統(tǒng)計數(shù)據(jù)作為詞典休吠。

IKAnalayzer

[IKAnalayzer adress:]{https://github.com/blueshen/ik-analyzer/tree/master}
相關(guān)java api依賴

<dependency>
  <groupId>org.wltea.ik-analyzer</groupId>
  <artifactId>ik-analyzer</artifactId>
  <version>7.5.0</version>
</dependency>

分詞算法知識擴(kuò)展

NLP的底層任務(wù)由易到難大致可以分為詞法分析、句法分析和語義分析酷誓。分詞是詞法分析(還包括詞性標(biāo)注和命名實體識別)中最基本的任務(wù)赫悄,可以說既簡單又復(fù)雜原献。分詞算法根據(jù)其核心思想主要分為兩種:
1.基于詞典的分詞,先把句子按照字典切分成詞涩蜘,再尋找詞的最佳組合方式
2.基于字的分詞嚼贡,即由字構(gòu)詞熏纯,先把句子分成一個個字同诫,再將字組合成詞,尋找最優(yōu)的切分策略樟澜,同時也可以轉(zhuǎn)化成序列標(biāo)注問題误窖。
歸根結(jié)底,上述兩種方法都可以歸結(jié)為在圖或者概率圖上尋找最短路徑的問題秩贰。

基于詞典的分詞

最大匹配分詞算法

最大匹配分詞尋找最優(yōu)組合的方式是將匹配到的最長詞組合在一起霹俺。主要的思路是先將詞典構(gòu)造成一棵Trie樹,也稱為字典樹

最短路徑分詞算法

最短路徑分詞算法首先將一句話中的所有詞匹配出來毒费,構(gòu)成詞圖(有向無環(huán)圖DAG)丙唧,之后尋找從起始點到終點的最短路徑作為最佳組合方式。

最短路徑算法

基于Dijkstra算法求解最短路徑觅玻。該算法適用于所有帶權(quán)有向圖想际,求解源節(jié)點到其他所有節(jié)點的最短路徑培漏,并可以求得全局最優(yōu)解。Dijkstra本質(zhì)為貪心算法胡本,在每一步走到當(dāng)前路徑最短的節(jié)點牌柄,遞推地更新原節(jié)點到其他節(jié)點的距離。

N-最短路徑算法

N-最短路徑分詞是對Dijkstra算法的擴(kuò)展侧甫,在每一步保存最短的N條路徑珊佣,并記錄這些路徑上當(dāng)前節(jié)點的前驅(qū),在最后求得最優(yōu)解時回溯得到最短路徑披粟。該方法的準(zhǔn)確率優(yōu)于Dijkstra算法咒锻,但在時間和空間復(fù)雜度上都更大。

基于字的分詞

與基于詞典的分詞不同的是守屉,基于字的分詞事先不對句子進(jìn)行詞的匹配虫碉,而是將分詞看成序列標(biāo)注問題,把一個字標(biāo)記成B(Begin), I(Inside), O(Outside), E(End), S(Single)胸梆。因此也可以看成是每個字的分類問題敦捧,輸入為每個字及其前后字所構(gòu)成的特征,輸出為分類標(biāo)記碰镜。對于分類問題兢卵,可以用統(tǒng)計機(jī)器學(xué)習(xí)或神經(jīng)網(wǎng)絡(luò)的方法求解。

生成式模型算法

生成式模型主要有NGram模型绪颖、HMM隱馬爾可夫模型秽荤、樸素貝葉斯分類等。在分詞中應(yīng)用比較多的是n-gram模型和HMM模型柠横。

判別式模型算法

判別式模型主要有感知機(jī)窃款、SVM支持向量機(jī)、CRF條件隨機(jī)場牍氛、最大熵模型等晨继。在分詞中常用的有感知機(jī)模型和CRF模型。

神經(jīng)網(wǎng)絡(luò)算法

在NLP中搬俊,最常用的神經(jīng)網(wǎng)絡(luò)為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN紊扬,Recurrent Neural Network),它在處理變長輸入和序列輸入問題中有著巨大的優(yōu)勢唉擂。LSTM為RNN變種的一種餐屎,在一定程度上解決了RNN在訓(xùn)練過程中梯度消失和梯度爆炸的問題。
至此玩祟,有關(guān)Lucene的分詞相關(guān)的算法大概給大家介紹完了腹缩,由于算法當(dāng)中涉及到機(jī)器學(xué)習(xí)的東西,在此沒法和大家分享了,但是針對于Lucene的有關(guān)搜索引擎原理知識以及API層的應(yīng)用會和大家一起分享藏鹊!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胜臊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伙判,更是在濱河造成了極大的恐慌象对,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宴抚,死亡現(xiàn)場離奇詭異勒魔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菇曲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門冠绢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人常潮,你說我怎么就攤上這事弟胀。” “怎么了喊式?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵孵户,是天一觀的道長。 經(jīng)常有香客問我岔留,道長夏哭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任献联,我火速辦了婚禮竖配,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘里逆。我一直安慰自己进胯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布原押。 她就那樣靜靜地躺著胁镐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪班眯。 梳的紋絲不亂的頭發(fā)上希停,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天烁巫,我揣著相機(jī)與錄音署隘,去河邊找鬼。 笑死亚隙,一個胖子當(dāng)著我的面吹牛磁餐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼诊霹,長吁一口氣:“原來是場噩夢啊……” “哼羞延!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脾还,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤伴箩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鄙漏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗤谚,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年怔蚌,在試婚紗的時候發(fā)現(xiàn)自己被綠了巩步。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡桦踊,死狀恐怖椅野,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情籍胯,我是刑警寧澤竟闪,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站杖狼,受9級特大地震影響瘫怜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜本刽,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一鲸湃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧子寓,春花似錦暗挑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲜屏,卻和暖如春烹看,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洛史。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工惯殊, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人也殖。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓土思,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子己儒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 常用概念: 自然語言處理(NLP) 數(shù)據(jù)挖掘 推薦算法 用戶畫像 知識圖譜 信息檢索 文本分類 常用技術(shù): 詞級別...
    御風(fēng)之星閱讀 9,166評論 1 25
  • 轉(zhuǎn)載請注明:終小南 ? 中文分詞算法總結(jié) 什么是中文分詞眾所周知崎岂,英文是以 詞為單位的,詞和詞之間是靠空格隔開闪湾,而...
    kirai閱讀 9,812評論 3 24
  • 鏈接分析 我們在最開始說過冲甘,搜索引擎在查找能夠滿足用戶需求的網(wǎng)頁時,主要會考慮兩方面的因素途样,一方面是用戶發(fā)出的查詢...
    我偏笑_NSNirvana閱讀 3,178評論 1 12
  • 簡介 NLP的底層任務(wù)由易到難大致可以分為詞法分析损合、句法分析和語義分析。分詞是詞法分析(還包括詞性標(biāo)注和命名實體識...
    郭少悲閱讀 6,496評論 0 4
  • 1娘纷、索引總體結(jié)構(gòu) 1.1嫁审、索引層次結(jié)構(gòu) Lucene的索引結(jié)構(gòu)主要分以下幾個層次: 索引(Index): 在Luc...
    橋頭放牛娃閱讀 3,205評論 0 6