HashMap实现中文分词器
????今天下午部門(mén)內(nèi)部技術(shù)分享是分詞器算法。這次的主講是大名鼎鼎的Ansj分詞器的作者-孫健。
作者簡(jiǎn)介:
1. Ansj分詞器作者
2. elasticsearch-sql(elasticsearch的sql插件)作者,支持sql查詢
3. nlp-lang自然語(yǔ)言工具包發(fā)起人
4. NLPCN(自然語(yǔ)言處理組織)發(fā)起人
等等…
網(wǎng)站:http://www.nlpcn.org/
GIT地址:https://github.com/NLPchina
具體作者詳情請(qǐng)百度、Google
????大神首先對(duì)中文分詞的概念進(jìn)行詳細(xì)的解釋,并對(duì)比了傳統(tǒng)分詞和自然語(yǔ)言分詞的區(qū)別和優(yōu)略勢(shì)。然后又講到目前中文分詞在應(yīng)用過(guò)程中遇到的一些困難,其中就包括中文歧義的識(shí)別(包含交叉歧義、組合歧義、真歧義)、人名識(shí)別、地名識(shí)別和機(jī)構(gòu)名識(shí)別。在這幾種難題中,又以機(jī)構(gòu)名識(shí)別最為困難(機(jī)構(gòu)名稱各種簡(jiǎn)稱如:北京大學(xué)(北大)、騰訊(鵝場(chǎng))等)。召回率和準(zhǔn)確率的關(guān)系,正向匹配、逆向匹配等等。生動(dòng)的講解了分詞的原理和難度所在。
????但是講到怎么實(shí)現(xiàn)的時(shí)候,大家都是一臉懵逼的,各種算法(Trie Tree、雙數(shù)組trie樹(shù)、CRF模型等)。聽(tīng)完就什么都不記得了,呵呵。
????不過(guò)講到最后的時(shí)候給我們分享了下HashMap的一種簡(jiǎn)單實(shí)現(xiàn)分詞器的思路,意外的收獲。下面通過(guò)代碼說(shuō)明(五分鐘搞定^_^)。
HashMap簡(jiǎn)單實(shí)現(xiàn)的分詞器
public class TokenizerDemo {private static Map<String, String> map = new HashMap<String, String>();//詞典中最長(zhǎng)詞的長(zhǎng)度,map中的key的最長(zhǎng)長(zhǎng)度private static final int maxSize = 3;static{//可以從數(shù)據(jù)庫(kù)中加載或詞表中加載map.put("中國(guó)", "");map.put("北京", "");map.put("中關(guān)村", "");map.put("海淀", "");}public static void main(String[] args) {String text = "中國(guó)人民共和國(guó)首都是北京,中關(guān)村在海淀區(qū)。";int length = text.length();for(int i=0; i<length; i++){int endIdx = i+maxSize;if(endIdx>length){endIdx = length;}//最大逆序匹配for(int j=0; j<maxSize; j++){String s = text.substring(i, endIdx);if(map.get(s)!=null){//跳過(guò)匹配過(guò)的詞(后面會(huì)說(shuō)明跳過(guò)匹配詞的原因)i=endIdx-1;System.out.println(s);break;}else{endIdx-=1;if(endIdx==i){break;}}}}} }輸出結(jié)果:
中國(guó)
北京
中關(guān)村
海淀
注意:
如果不跳過(guò)已經(jīng)匹配的詞會(huì)出現(xiàn)”北京劇院” 拆分成 [北京]、[京劇]、[劇院] 三個(gè)詞,
如果跳過(guò)匹配過(guò)的詞就會(huì)拆分成 [北京]、[劇院]。
分詞原理:
從詞典中找出最長(zhǎng)詞的長(zhǎng)度,這里為maxSize=3,按照maxSize的長(zhǎng)度從文本的第一位(i=0)截取要抽取的文本【中國(guó)人】,然后去Map中查找是否有對(duì)應(yīng)的值,如果沒(méi)有減去一個(gè)長(zhǎng)度截取(maxSize-1)【中國(guó)】,去Map中查找,找到則停止當(dāng)前查找,接著從匹配當(dāng)前詞后面的字(i=2)【人民共】開(kāi)始繼續(xù)上述的步驟開(kāi)始查找。
代碼執(zhí)行的流程如下:
第一次循環(huán)(i=0):中國(guó)人 -> 無(wú)命中(map中沒(méi)找到) (j=0)中國(guó) -> map命中 (j=1) 【注釋:命中后i+2(當(dāng)前詞)的長(zhǎng)度。所以i=2】第二次循環(huán)(i=2):人民共 -> 無(wú)命中 (j=0)人民 -> 無(wú)命中 (j=1)人 -> 無(wú)命中 (j=2)第三次循環(huán)(i=3):民共和 -> 無(wú)命中 (j=0)民共 -> 無(wú)命中 (j=1)民 -> 無(wú)命中 (j=2)...依次類(lèi)推,找出文本中所有匹配詞典中的詞很簡(jiǎn)單的代碼就說(shuō)明了分詞器的原理(只是最簡(jiǎn)單、能命中詞而以)。
應(yīng)用場(chǎng)景
敏感詞、文字過(guò)濾是一個(gè)網(wǎng)站必不可少的功能,可以使用這么簡(jiǎn)單的幾行代碼實(shí)現(xiàn)網(wǎng)站的敏感詞過(guò)濾功能,自己這么簡(jiǎn)單幾行代碼就能實(shí)現(xiàn)是不是很棒。
本人簡(jiǎn)書(shū)blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點(diǎn)擊這里快速進(jìn)入簡(jiǎn)書(shū)
GIT地址:http://git.oschina.net/brucekankan/
點(diǎn)擊這里快速進(jìn)入GIT
總結(jié)
以上是生活随笔為你收集整理的HashMap实现中文分词器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JVM(HotSpot) 垃圾收集器
- 下一篇: 更改环境变量JAVA_HOME无效