摘要:談談我做拼音搜索的一點經驗需要注意的一些事情本文使用的為語言解決方案。當然也我們可以自己實現轉換拼音的功能,如果這樣做,則需要在代碼中設定好中文字庫和對應的拼音,同時特別注意多音字的處理。
談談我做拼音搜索的一點經驗 需要注意的一些事情
本文使用的為 Java 語言解決方案。
搜索方法上,按照個人理解,有兩點關鍵:
分詞
將類似 "women" 這樣的詞分解成 "wo"men"。經過這樣的分詞,在搜索時無論通過全拼音匹配,還是首字母匹配,處理起來都比較方便。
詞庫構建
目前我接觸過的常見搜索場景有兩種,它們對詞庫的建立有如下影響:
通訊錄搜索
對詞庫有頻繁的添加 / 刪除操作。
站內搜索
使用預先維護好的詞庫。
實現如果是通訊錄搜索,可以在新建聯系人的時候,把聯系人的名字轉為拼音,存入數據庫中另一個記錄拼音的字段,在搜索的時候通過拼音來匹配。
如果是站內搜索,可以直接建立拼音詞庫,搜索的時候通過拼音來匹配。
首先是詞庫的構建。毫無疑問,我們需要為詞庫建一張至少包含中文詞匯以及對應的拼音詞匯的表。
通訊錄搜索,可能會使用一些例如 pinyin4j 的第三方庫,將中文字轉換為拼音。當然也我們可以自己實現轉換拼音的功能,如果這樣做,則需要在代碼中設定好中文字庫和對應的拼音,同時特別注意多音字的處理。
下面是使用 pinyin4j 庫的例子。使用 pinyin4j 庫可以支持簡體 / 繁體中文轉換為拼音,而且支持帶聲調的格式化輸出。
我們使用 Maven 來添加 pinyin4j,在 pom.xml 中添加
com.belerweb pinyin4j 2.5.0
實現類:
public class Chinese { private HanyuPinyinOutputFormat format = null; private String[] pinyin; public Chinese() { format = new HanyuPinyinOutputFormat(); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); pinyin = null; } //轉換單個中文字符 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]; } //轉換一個字符串 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); } }
輸出的結果
ha"ha,wo"ai Coding
每當有通訊錄聯系人更新時,采用上述方法更新數據庫中的拼音字段即可。
站內搜索,詞庫來源可以使用搜狗標準詞庫和細胞詞庫等。
搜狗標準詞庫
下載的搜狗詞庫可以使用深藍詞庫轉換器來轉換成 txt 文件,或者其他輸入法的標準格式。
深藍詞庫轉換 2.0
轉換為 txt 文件后,處理以后,修改成為 insert 語句,插入數據庫。
最后的關鍵,就是將輸入的拼音分詞,然后與數據庫中的拼音字段匹配,分詞采用正則表達式實現。
分詞實現:
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)); } }
輸出結果
kou"ding"bo"ke
根據此輸出結果,在詞庫中匹配即可。
根據以上方式搜索出的詞匯,會比較固定。如果有按照搜索頻率對搜索結果排序的需求,可以針對每個詞匯的查詢計數。具體實現這里不再贅述。
個人一點粗淺經驗,歡迎各位大牛一起交流。
參考來源怎樣對拼音進行切分?
Brook Zhao
本文來自 Coding 官方技術博客,如需轉載請注明出處,謝謝。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64251.html
摘要:而且,據說他的大女兒和小女兒都是做測試的,這是名副其實的測試世家。確定測試需求相應的測試方法獲得測試策略方案。負責這一領域測試質量保證開發內的整個開發生存周期業務。 ...
摘要:軟件測試自學秘訣面試失敗一天,心態穩的一批,因為面試的全是外包人事幫我聯系的公司,工資全都是一萬以上,之前只有四五千的自己根本不覺得自己能勝任。 個人是去年年底零基礎轉行,兩三千培訓費學出來,學完后也是稀里糊涂,僅是知道功能測試就是找問題,其他接口,性能,數據庫,python基礎,虛擬機搭建網站都實現了課程展示那樣。面試資...
摘要:最近看到知乎上面很多討伐培訓班的問答文章,不禁想到了我和新手同事合作的一些經歷其實你是培訓班出來還是計算機科班畢業,沒人在乎,關鍵是你表現出來的一些問題切切實實的對你的同事或合作伙伴造成了很大困擾,而且這些問題集中在某一部分人身上顯露出來, 最近看到知乎上面很多討伐培訓班的問答、文章,不禁想到了我和新手同事合作的一些經歷; 其實你是培訓班出來還是計算機科班畢業,沒人在乎,關鍵是你表...
摘要:最近看到知乎上面很多討伐培訓班的問答文章,不禁想到了我和新手同事合作的一些經歷其實你是培訓班出來還是計算機科班畢業,沒人在乎,關鍵是你表現出來的一些問題切切實實的對你的同事或合作伙伴造成了很大困擾,而且這些問題集中在某一部分人身上顯露出來, 最近看到知乎上面很多討伐培訓班的問答、文章,不禁想到了我和新手同事合作的一些經歷; 其實你是培訓班出來還是計算機科班畢業,沒人在乎,關鍵是你表...
閱讀 3152·2021-09-30 09:47
閱讀 2003·2021-09-22 16:04
閱讀 2274·2021-09-22 15:44
閱讀 2534·2021-08-25 09:38
閱讀 540·2019-08-26 13:23
閱讀 1221·2019-08-26 12:20
閱讀 2807·2019-08-26 11:59
閱讀 1077·2019-08-23 18:40