java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
搜索引擎中對于Q查詢,都會涉及到字符串歸一化這個(gè)步驟,以提高結(jié)果召回率。字符串的歸一化包括三個(gè)方面:繁體轉(zhuǎn)簡體;全角字符轉(zhuǎn)半角;大寫字母轉(zhuǎn)小寫。
建倒排時(shí),會先對字符串做歸一化處理,然后再分詞取term;用戶查詢時(shí),也會對查詢串做同樣的操作,這樣就能找到對應(yīng)的倒排鏈。
在返回查詢結(jié)果給前端時(shí),會按照查詢串對原文做飄紅,這里就涉及到一個(gè)問題,原文是沒有歸一化的;為了解決這個(gè)問題,我們自己寫了個(gè)normalize_strstr,如下:
char* normalize_strstr(const char *src, int srclen,
const char *key, int keylen, int *outsize){
unsigned short srcword = 0, keyword = 0;
int srcpos = 0;
do {
int tmppos = srcpos;
int keypos = 0;
do {
keyword = get_utf8_word(key, keylen, &keypos);
if(keyword == 0) {
*outsize = tmppos - srcpos;
return (char*)(src + srcpos);
}
srcword = get_utf8_word(src, srclen, &tmppos);
if(srcword == 0) {
return NULL;
}
}while(TOLOWER(g_uni_normal_map[keyword]) ==??? // compare key with substr
TOLOWER(g_uni_normal_map[srcword]));??? // normal map doesn't convert upper case to lower
} while(get_utf8_word(src, srclen, &srcpos) != 0);? // move forward one utf8 character
return NULL;
}
關(guān)于gbk, gb18030, utf8, unicode等問題,可以參見: http://www.cnblogs.com/xiaomia/archive/2010/11/28/1890072.html 。
幾個(gè)關(guān)鍵點(diǎn):gbk都是雙字節(jié);gb18030大多都是雙字節(jié),有少量4字節(jié);unicode為世界上每個(gè)字指定一個(gè)編碼,目前還沒有超出2字節(jié); utf8是對unicode的編碼,以便于傳輸,目前有1字節(jié),2字節(jié),3字節(jié),4,5,6字節(jié),中文大多落在3字節(jié)。所以中文用utf8存儲,比gbk存儲要多出50%空間。另外strstr系列函數(shù),對gbk是不安全的,即第一個(gè)字符的第二個(gè)字節(jié),和第二個(gè)字符的第一個(gè)字節(jié),可能是另外一個(gè)漢字。但utf8對strstr就是安全的,浪費(fèi)一些空間,讓每個(gè)byte的前綴不同。
編碼轉(zhuǎn)碼相關(guān)的代碼,可以參考:http://code.google.com/p/pycode-hz/ 。 這是py的作品,簡潔明了,看看就知道編碼究竟是怎么回事。不過效率的話,這里的編碼轉(zhuǎn)換性能,不如系統(tǒng)自帶的iconv高。
總結(jié)
以上是生活随笔為你收集整理的java对字符串归一化_搜索引擎中的字符串归一化 | 学步园的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac远程桌面登陆windows
- 下一篇: windows-server-2012R