今天下午部門內(nèi)部技術(shù)分享是分詞器算法。這次的主講是大名鼎鼎的Ansj分詞器的作者-孫健捂襟。
作者簡介:
- Ansj分詞器作者
- elasticsearch-sql(elasticsearch的sql插件)作者,支持sql查詢
- nlp-lang自然語言工具包發(fā)起人
- NLPCN(自然語言處理組織)發(fā)起人
等等...
網(wǎng)站:http://www.nlpcn.org/
GIT地址:https://github.com/NLPchina
具體作者詳情請百度践付、Google
大神首先對中文分詞的概念進行詳細的解釋全封,并對比了傳統(tǒng)分詞和自然語言分詞的區(qū)別和優(yōu)略勢。然后又講到目前中文分詞在應(yīng)用過程中遇到的一些困難榄檬,其中就包括中文歧義的識別(包含交叉歧義卜范、組合歧義、真歧義)丙号、人名識別先朦、地名識別和機構(gòu)名識別缰冤。在這幾種難題中,又以機構(gòu)名識別最為困難(機構(gòu)名稱各種簡稱如:北京大學(xué)(北大)喳魏、騰訊(鵝場)等)棉浸。召回率和準確率的關(guān)系,正向匹配刺彩、逆向匹配等等迷郑。生動的講解了分詞的原理和難度所在。
但是講到怎么實現(xiàn)的時候创倔,大家都是一臉懵逼的嗡害,各種算法(Trie Tree、雙數(shù)組trie樹畦攘、CRF模型等)霸妹。聽完就什么都不記得了,呵呵知押。
不過講到最后的時候給我們分享了下HashMap的一種簡單實現(xiàn)分詞器的思路叹螟,意外的收獲。下面通過代碼說明(五分鐘搞定_)台盯。
HashMap簡單實現(xiàn)的分詞器
public class TokenizerDemo {
private static Map<String, String> map = new HashMap<String, String>();
//詞典中最長詞的長度罢绽,map中的key的最長長度
private static final int maxSize = 3;
static{
//可以從數(shù)據(jù)庫中加載或詞表中加載
map.put("中國", "");
map.put("北京", "");
map.put("中關(guān)村", "");
map.put("海淀", "");
}
public static void main(String[] args) {
String text = "中國人民共和國首都是北京,中關(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){
//跳過匹配過的詞(后面會說明跳過匹配詞的原因)
i=endIdx-1;
System.out.println(s);
break;
}else{
endIdx-=1;
if(endIdx==i){
break;
}
}
}
}
}
}
輸出結(jié)果:
中國
北京
中關(guān)村
海淀
?
注意:
如果不跳過已經(jīng)匹配的詞會出現(xiàn)"北京劇院" 拆分成 [北京]良价、[京劇]、[劇院] 三個詞蒿叠,
如果跳過匹配過的詞就會拆分成 [北京]明垢、[劇院]。
分詞原理:
從詞典中找出最長詞的長度栈虚,這里為maxSize=3袖外,按照maxSize的長度從文本的第一位(i=0)截取要抽取的文本【中國人】,然后去Map中查找是否有對應(yīng)的值魂务,如果沒有減去一個長度截嚷椤(maxSize-1)【中國】,去Map中查找粘姜,找到則停止當前查找鬓照,接著從匹配當前詞后面的字(i=2)【人民共】開始繼續(xù)上述的步驟開始查找。
代碼執(zhí)行的流程如下:
第一次循環(huán)(i=0):
中國人 -> 無命中(map中沒找到) (j=0)
中國 -> map命中 (j=1) 【注釋:命中后i+2(當前詞)的長度孤紧。所以i=2】
第二次循環(huán)(i=2):
人民共 -> 無命中 (j=0)
人民 -> 無命中 (j=1)
人 -> 無命中 (j=2)
第三次循環(huán)(i=3):
民共和 -> 無命中 (j=0)
民共 -> 無命中 (j=1)
民 -> 無命中 (j=2)
...依次類推豺裆,找出文本中所有匹配詞典中的詞
很簡單的代碼就說明了分詞器的原理(只是最簡單、能命中詞而以)。
應(yīng)用場景
敏感詞臭猜、文字過濾是一個網(wǎng)站必不可少的功能躺酒,可以使用這么簡單的幾行代碼實現(xiàn)網(wǎng)站的敏感詞過濾功能,自己這么簡單幾行代碼就能實現(xiàn)是不是很棒蔑歌。