java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
搜索引擎中對于Q查詢,都會涉及到字符串歸一化這個步驟,以提高結果召回率。字符串的歸一化包括三個方面:繁體轉簡體;全角字符轉半角;大寫字母轉小寫。
建倒排時,會先對字符串做歸一化處理,然后再分詞取term;用戶查詢時,也會對查詢串做同樣的操作,這樣就能找到對應的倒排鏈。
在返回查詢結果給前端時,會按照查詢串對原文做飄紅,這里就涉及到一個問題,原文是沒有歸一化的;為了解決這個問題,我們自己寫了個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;
}
關于gbk, gb18030, utf8, unicode等問題,可以參見: http://www.cnblogs.com/xiaomia/archive/2010/11/28/1890072.html 。
幾個關鍵點:gbk都是雙字節;gb18030大多都是雙字節,有少量4字節;unicode為世界上每個字指定一個編碼,目前還沒有超出2字節; utf8是對unicode的編碼,以便于傳輸,目前有1字節,2字節,3字節,4,5,6字節,中文大多落在3字節。所以中文用utf8存儲,比gbk存儲要多出50%空間。另外strstr系列函數,對gbk是不安全的,即第一個字符的第二個字節,和第二個字符的第一個字節,可能是另外一個漢字。但utf8對strstr就是安全的,浪費一些空間,讓每個byte的前綴不同。
編碼轉碼相關的代碼,可以參考:http://code.google.com/p/pycode-hz/ 。 這是py的作品,簡潔明了,看看就知道編碼究竟是怎么回事。不過效率的話,這里的編碼轉換性能,不如系統自帶的iconv高。
總結
以上是生活随笔為你收集整理的java对字符串归一化_搜索引擎中的字符串归一化 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac远程桌面登陆windows
- 下一篇: 终端到服务器丢包,服务器丢包 ping的