亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5115 | 回復: 0
打印 上一主題 下一主題

談談我做拼音搜索的一點經(jīng)驗 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-01-27 12:16 |只看該作者 |倒序瀏覽
需要注意的一些事情
本文使用的為 Java 語言解決方案。

搜索方法上,按照個人理解,有兩點關鍵:

  • 分詞

將類似 “women” 這樣的詞分解成 “wo’men”。經(jīng)過這樣的分詞,在搜索時無論通過全拼音匹配,還是首字母匹配,處理起來都比較方便。

  • 詞庫構建

目前我接觸過的常見搜索場景有兩種,它們對詞庫的建立有如下影響:

1.通訊錄搜索
對詞庫有頻繁的添加 / 刪除操作。

2.站內搜索
使用預先維護好的詞庫。

如果是通訊錄搜索,可以在新建聯(lián)系人的時候,把聯(lián)系人的名字轉為拼音,存入數(shù)據(jù)庫中另一個記錄拼音的字段,在搜索的時候通過拼音來匹配。
如果是站內搜索,可以直接建立拼音詞庫,搜索的時候通過拼音來匹配。

實現(xiàn)
首先是詞庫的構建。毫無疑問,我們需要為詞庫建一張至少包含中文詞匯以及對應的拼音詞匯的表。
通訊錄搜索,可能會使用一些例如 pinyin4j 的第三方庫,將中文字轉換為拼音。當然也我們可以自己實現(xiàn)轉換拼音的功能,如果這樣做,則需要在代碼中設定好中文字庫和對應的拼音,同時特別注意多音字的處理。

下面是使用 pinyin4j 庫的例子。使用 pinyin4j 庫可以支持簡體 / 繁體中文轉換為拼音,而且支持帶聲調的格式化輸出。
我們使用 Maven 來添加 pinyin4j,在 pom.xml 中添加
  1. <dependencies>
  2.         <dependency>
  3.             <groupId>com.belerweb</groupId>
  4.             <artifactId>pinyin4j</artifactId>
  5.             <version>2.5.0</version>
  6.         </dependency>
  7.     </dependencies>
復制代碼
實現(xiàn)類:
  1. public class Chinese {
  2.     private HanyuPinyinOutputFormat format = null;

  3.     private String[] pinyin;

  4.     public Chinese() {
  5.         format = new HanyuPinyinOutputFormat();
  6.         format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  7.         pinyin = null;
  8.     }

  9.     //轉換單個中文字符
  10.     public String getCharacterPinYin(char c) {
  11.         try {
  12.             pinyin = PinyinHelper.toHanyuPinyinStringArray(c, format);
  13.         } catch(BadHanyuPinyinOutputFormatCombination e) {
  14.             e.printStackTrace();
  15.         }

  16.         // 如果c不是漢字,返回null
  17.         if(null == pinyin)
  18.             return null;

  19.         // 多音字取第一個值
  20.         return pinyin[0];
  21.     }

  22.     //轉換一個字符串
  23.     public String getStringPinYin(String str) {
  24.         StringBuilder sb = new StringBuilder();

  25.         for(int i = 0; i < str.length(); ++i) {
  26.             String tmp = getCharacterPinYin(str.charAt(i));
  27.             if(null == tmp) {
  28.                 // 如果str.charAt(i)不是漢字,則保持原樣
  29.                 sb.append(str.charAt(i));
  30.             } else {
  31.                 sb.append(tmp);
  32.                 //分詞
  33.                 if ( i < str.length() - 1 && null != getCharacterPinYin(str.charAt(i + 1))) {
  34.                     sb.append("\'");
  35.                 }
  36.             }
  37.         }
  38.         return sb.toString().trim();
  39.     }

  40.     public static void main(String[] args) {
  41.         Chinese chinese = new Chinese();
  42.         String str = "哈哈,我愛 Coding";
  43.         String pinYin = chinese.getStringPinYin(str);
  44.         System.out.println(pinYin);
  45.     }
  46. }
復制代碼
輸出的結果
  1. ha'ha,wo'ai Coding
復制代碼
每當有通訊錄聯(lián)系人更新時,采用上述方法更新數(shù)據(jù)庫中的拼音字段即可。



站內搜索,詞庫來源可以使用搜狗標準詞庫和細胞詞庫等。
搜狗標準詞庫

下載的搜狗詞庫可以使用深藍詞庫轉換器來轉換成 txt 文件,或者其他輸入法的標準格式。
深藍詞庫轉換 2.0

轉換為 txt 文件后,處理以后,修改成為 insert 語句,插入數(shù)據(jù)庫。



最后的關鍵,就是將輸入的拼音分詞,然后與數(shù)據(jù)庫中的拼音字段匹配,分詞采用正則表達式實現(xiàn)。

分詞實現(xiàn):
  1. public class PinyinUtils {

  2.         //分詞正則表達式
  3.     public static String regEx  = "[^aoeiuv]?h?[iuv]?(ai|ei|ao|ou|er|ang?|eng?|ong|a|o|e|i|u|ng|n)?";

  4.     public static String split(String input) {
  5.         int tag = 0;
  6.         StringBuffer sb = new StringBuffer();
  7.         String formatted = "";
  8.         List<String> tokenResult = new ArrayList<String>();
  9.         for (int i = input.length(); i > 0; i = i - tag) {
  10.             Pattern pat = Pattern.compile(regEx);
  11.             Matcher matcher = pat.matcher(input);
  12.             boolean rs = matcher.find();
  13.             sb.append(matcher.group());
  14.             sb.append("\'");
  15.             tag = matcher.end() - matcher.start();
  16.             tokenResult.add(input.substring(0, 1));
  17.             input = input.substring(tag);
  18.         }
  19.         if (sb.length() > 0) {
  20.             formatted = sb.toString().substring(0, sb.toString().length() - 1);
  21.         }
  22.         return formatted;
  23.     }


  24.     public static void main(String[] args) {
  25.         String str = "koudingboke";
  26.         System.out.println(PinyinUtils.split(str));
  27.     }
  28. }
復制代碼
輸出結果  
  1. kou'ding'bo'ke
復制代碼
根據(jù)此輸出結果,在詞庫中匹配即可。

根據(jù)以上方式搜索出的詞匯,會比較固定。如果有按照搜索頻率對搜索結果排序的需求,可以針對每個詞匯的查詢計數(shù)。具體實現(xiàn)這里不再贅述。



個人一點粗淺經(jīng)驗,歡迎各位大牛一起交流。

本文來自 Coding 官方技術博客(blog.coding.net),如需轉載請注明出處,謝謝。

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP