序
源于在開(kāi)發(fā)了拖拉機(jī)跟打器之后檀头,就有人問(wèn)過(guò)轰异,跟打器的詞語(yǔ)標(biāo)記是怎么算出來(lái)的,找了個(gè)時(shí)間寫(xiě)下這篇文章暑始,整篇文章建立在java的基礎(chǔ)上搭独。
該文章中只提思路給打算自己創(chuàng)造跟打器或者對(duì)詞語(yǔ)提示有興趣的讀者,不涉及到主要源碼廊镜。
拖拉機(jī)跟打器詞語(yǔ)標(biāo)記算法
1)對(duì)碼表按行讀取牙肝,并以tab鍵為分隔提取出中文詞條和英文編碼,命名為嗤朴,ch和bm(扣腳命名莫嫌棄)
2)將碼表按照詞條長(zhǎng)度分類進(jìn)入不同的HashMap中配椭,并用ArrayList將多個(gè)HashMap<String,String>串起來(lái)。
3)運(yùn)算第一次循環(huán)雹姊,將獲取的文章遍歷股缸,并從長(zhǎng)度最長(zhǎng)開(kāi)始匹配詞條,大概就是如下圖吱雏,如果到某個(gè)位置與詞語(yǔ)
敦姻,則將該詞語(yǔ)
下標(biāo)記錄,并從步驟2中存入的hashmap提取出該詞語(yǔ)的編碼長(zhǎng)度歧杏,再將該文擁有的詞按
進(jìn)行分類镰惦。
假設(shè),第一次循環(huán)中獲取匹配詞語(yǔ)的占用位置如下圖(紅色)犬绒,當(dāng)在以后的回塑循環(huán)中(綠色)旺入,就要進(jìn)行回避這些位置的匹配。并將詞語(yǔ)對(duì)應(yīng)編碼長(zhǎng)度放入對(duì)應(yīng)的分類凯力,往后以此類推眨业。
4)當(dāng)你將所有長(zhǎng)度的可能詞條都遍歷了一遍,我現(xiàn)在設(shè)定的是最長(zhǎng)詞條為13,即只遍歷文章13遍(越到后面其實(shí)回避做的更多)沮协。而存入HashMap中龄捡,使匹配消耗資源不至于過(guò)大。走完13遍之后慷暂,我們就可以根據(jù)我們之前以編碼長(zhǎng)度來(lái)分類的占用位置來(lái)進(jìn)行標(biāo)記顏色聘殖。
那么可以得知晨雳,我們一共創(chuàng)建了
用于存儲(chǔ)碼表關(guān)系的1個(gè)List中和對(duì)應(yīng)最長(zhǎng)詞條長(zhǎng)度n個(gè)Map
用于記錄標(biāo)色的對(duì)應(yīng)目標(biāo)文章中的最長(zhǎng)詞條編碼長(zhǎng)度m個(gè)List
(在實(shí)際操作中創(chuàng)建的可能比預(yù)想的更多,看每個(gè)人的思路)
對(duì)于非首選的其他奸腺,次選餐禁,三選,四選突照“锓牵可以識(shí)別編碼的最后一位
這大概只講思路不詳細(xì)深入,希望讀者自己多加研究讹蘑。
理論編碼(類似極速賽碼)
對(duì)于理論編碼末盔,只是在詞語(yǔ)標(biāo)記的基礎(chǔ)上增加了一些對(duì)編碼的操作,其實(shí)也非常簡(jiǎn)單座慰。說(shuō)說(shuō)我的做法
1)在詞語(yǔ)標(biāo)記的基礎(chǔ)上陨舱,再創(chuàng)建一個(gè)HashMap<int,String>,命名為bianma版仔,在詞語(yǔ)標(biāo)記步驟3與步驟4的遍歷中游盲,匹配到詞語(yǔ)的占用位置后,將占用的首位放入key蛮粮,對(duì)應(yīng)的編碼放入value益缎。
2)等所有的遍歷做完,做一個(gè)循環(huán)for(i從0到目標(biāo)文章.length-1)然想,for內(nèi)執(zhí)行链峭,得出的showstr就是整篇文章的理論編碼
for(int i=0;i<c.length;i++){
if(Tips.bianma.containsKey(i)){
showstr.append(Tips.bianma.get(i));
}
}
算法缺點(diǎn)
在面對(duì)長(zhǎng)詞對(duì)短詞的場(chǎng)合下,可以達(dá)到最佳的詞語(yǔ)提示
例如:怎么樣
這個(gè)時(shí)候就會(huì)標(biāo)記“怎么樣”又沾,并不會(huì)單獨(dú)標(biāo)記“怎么”弊仪。
但在某些特定的同編碼長(zhǎng)度組合,有可能并不是最佳標(biāo)記與最短碼長(zhǎng)打法杖刷。
例如:上身體
先不說(shuō)這個(gè)詭異的詞励饵,但是這個(gè)組合在我的詞庫(kù)中是有兩個(gè)詞的
“上身”,“身體”
而“上身”編碼為“uhuf”滑燃,“身體”編碼為“ut”役听,這個(gè)時(shí)候,標(biāo)記會(huì)標(biāo)記“上身”的四碼詞顏色表窘,并不是標(biāo)記“身體”的二簡(jiǎn)顏色典予,最終獲得的理論編碼為“uhufti_”而不是理想的“uh_ut_”
算法復(fù)雜測(cè)試
在進(jìn)行壓力測(cè)試,導(dǎo)入了10w字的文章大概載了30秒乐严。