摘要:談談我做拼音搜索的一點經(jīng)驗需要注意的一些事情本文使用的為語言解決方案。當然也我們可以自己實現(xiàn)轉(zhuǎn)換拼音的功能,如果這樣做,則需要在代碼中設(shè)定好中文字庫和對應的拼音,同時特別注意多音字的處理。
談談我做拼音搜索的一點經(jīng)驗 需要注意的一些事情
本文使用的為 Java 語言解決方案。
搜索方法上,按照個人理解,有兩點關(guān)鍵:
分詞
將類似 "women" 這樣的詞分解成 "wo"men"。經(jīng)過這樣的分詞,在搜索時無論通過全拼音匹配,還是首字母匹配,處理起來都比較方便。
詞庫構(gòu)建
目前我接觸過的常見搜索場景有兩種,它們對詞庫的建立有如下影響:
通訊錄搜索
對詞庫有頻繁的添加 / 刪除操作。
站內(nèi)搜索
使用預先維護好的詞庫。
實現(xiàn)如果是通訊錄搜索,可以在新建聯(lián)系人的時候,把聯(lián)系人的名字轉(zhuǎn)為拼音,存入數(shù)據(jù)庫中另一個記錄拼音的字段,在搜索的時候通過拼音來匹配。
如果是站內(nèi)搜索,可以直接建立拼音詞庫,搜索的時候通過拼音來匹配。
首先是詞庫的構(gòu)建。毫無疑問,我們需要為詞庫建一張至少包含中文詞匯以及對應的拼音詞匯的表。
通訊錄搜索,可能會使用一些例如 pinyin4j 的第三方庫,將中文字轉(zhuǎn)換為拼音。當然也我們可以自己實現(xiàn)轉(zhuǎn)換拼音的功能,如果這樣做,則需要在代碼中設(shè)定好中文字庫和對應的拼音,同時特別注意多音字的處理。
下面是使用 pinyin4j 庫的例子。使用 pinyin4j 庫可以支持簡體 / 繁體中文轉(zhuǎn)換為拼音,而且支持帶聲調(diào)的格式化輸出。
我們使用 Maven 來添加 pinyin4j,在 pom.xml 中添加
com.belerweb pinyin4j 2.5.0
實現(xiàn)類:
public class Chinese { private HanyuPinyinOutputFormat format = null; private String[] pinyin; public Chinese() { format = new HanyuPinyinOutputFormat(); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); pinyin = null; } //轉(zhuǎn)換單個中文字符 public String getCharacterPinYin(char c) { try { pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format); } catch(BadHanyuPinyinOutputFormatCombination e) { e.printStackTrace(); } // 如果c不是漢字,返回null if(null == pinyin) return null; // 多音字取第一個值 return pinyin[0]; } //轉(zhuǎn)換一個字符串 public String getStringPinYin(String str) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < str.length(); ++i) { String tmp = getCharacterPinYin(str.charAt(i)); if(null == tmp) { // 如果str.charAt(i)不是漢字,則保持原樣 sb.append(str.charAt(i)); } else { sb.append(tmp); //分詞 if ( i < str.length() - 1 && null != getCharacterPinYin(str.charAt(i + 1))) { sb.append("""); } } } return sb.toString().trim(); } public static void main(String[] args) { Chinese chinese = new Chinese(); String str = "哈哈,我愛 Coding"; String pinYin = chinese.getStringPinYin(str); System.out.println(pinYin); } }
輸出的結(jié)果
ha"ha,wo"ai Coding
每當有通訊錄聯(lián)系人更新時,采用上述方法更新數(shù)據(jù)庫中的拼音字段即可。
站內(nèi)搜索,詞庫來源可以使用搜狗標準詞庫和細胞詞庫等。
搜狗標準詞庫
下載的搜狗詞庫可以使用深藍詞庫轉(zhuǎn)換器來轉(zhuǎn)換成 txt 文件,或者其他輸入法的標準格式。
深藍詞庫轉(zhuǎn)換 2.0
轉(zhuǎn)換為 txt 文件后,處理以后,修改成為 insert 語句,插入數(shù)據(jù)庫。
最后的關(guān)鍵,就是將輸入的拼音分詞,然后與數(shù)據(jù)庫中的拼音字段匹配,分詞采用正則表達式實現(xiàn)。
分詞實現(xiàn):
public class PinyinUtils { //分詞正則表達式 public static String regEx = "[^aoeiuv]?h?[iuv]?(ai|ei|ao|ou|er|ang?|eng?|ong|a|o|e|i|u|ng|n)?"; public static String split(String input) { int tag = 0; StringBuffer sb = new StringBuffer(); String formatted = ""; ListtokenResult = new ArrayList (); for (int i = input.length(); i > 0; i = i - tag) { Pattern pat = Pattern.compile(regEx); Matcher matcher = pat.matcher(input); boolean rs = matcher.find(); sb.append(matcher.group()); sb.append("""); tag = matcher.end() - matcher.start(); tokenResult.add(input.substring(0, 1)); input = input.substring(tag); } if (sb.length() > 0) { formatted = sb.toString().substring(0, sb.toString().length() - 1); } return formatted; } public static void main(String[] args) { String str = "koudingboke"; System.out.println(PinyinUtils.split(str)); } }
輸出結(jié)果
kou"ding"bo"ke
根據(jù)此輸出結(jié)果,在詞庫中匹配即可。
根據(jù)以上方式搜索出的詞匯,會比較固定。如果有按照搜索頻率對搜索結(jié)果排序的需求,可以針對每個詞匯的查詢計數(shù)。具體實現(xiàn)這里不再贅述。
個人一點粗淺經(jīng)驗,歡迎各位大牛一起交流。
參考來源怎樣對拼音進行切分?
Brook Zhao
本文來自 Coding 官方技術(shù)博客,如需轉(zhuǎn)載請注明出處,謝謝。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64251.html
摘要:而且,據(jù)說他的大女兒和小女兒都是做測試的,這是名副其實的測試世家。確定測試需求相應的測試方法獲得測試策略方案。負責這一領(lǐng)域測試質(zhì)量保證開發(fā)內(nèi)的整個開發(fā)生存周期業(yè)務。 ...
摘要:軟件測試自學秘訣面試失敗一天,心態(tài)穩(wěn)的一批,因為面試的全是外包人事幫我聯(lián)系的公司,工資全都是一萬以上,之前只有四五千的自己根本不覺得自己能勝任。 個人是去年年底零基礎(chǔ)轉(zhuǎn)行,兩三千培訓費學出來,學完后也是稀里糊涂,僅是知道功能測試就是找問題,其他接口,性能,數(shù)據(jù)庫,python基礎(chǔ),虛擬機搭建網(wǎng)站都實現(xiàn)了課程展示那樣。面試資...
摘要:最近看到知乎上面很多討伐培訓班的問答文章,不禁想到了我和新手同事合作的一些經(jīng)歷其實你是培訓班出來還是計算機科班畢業(yè),沒人在乎,關(guān)鍵是你表現(xiàn)出來的一些問題切切實實的對你的同事或合作伙伴造成了很大困擾,而且這些問題集中在某一部分人身上顯露出來, 最近看到知乎上面很多討伐培訓班的問答、文章,不禁想到了我和新手同事合作的一些經(jīng)歷; 其實你是培訓班出來還是計算機科班畢業(yè),沒人在乎,關(guān)鍵是你表...
摘要:最近看到知乎上面很多討伐培訓班的問答文章,不禁想到了我和新手同事合作的一些經(jīng)歷其實你是培訓班出來還是計算機科班畢業(yè),沒人在乎,關(guān)鍵是你表現(xiàn)出來的一些問題切切實實的對你的同事或合作伙伴造成了很大困擾,而且這些問題集中在某一部分人身上顯露出來, 最近看到知乎上面很多討伐培訓班的問答、文章,不禁想到了我和新手同事合作的一些經(jīng)歷; 其實你是培訓班出來還是計算機科班畢業(yè),沒人在乎,關(guān)鍵是你表...
閱讀 3182·2021-09-30 09:47
閱讀 2043·2021-09-22 16:04
閱讀 2308·2021-09-22 15:44
閱讀 2570·2021-08-25 09:38
閱讀 565·2019-08-26 13:23
閱讀 1257·2019-08-26 12:20
閱讀 2835·2019-08-26 11:59
閱讀 1107·2019-08-23 18:40