前情提要
關(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)用會和大家一起分享藏鹊!