同音别字纠错字典的创建

题外话:搜狗实验室http://www.sogou.com/labs/ 提供了很多中文语料库,有词典词频和词性,基于web域的。我们这里先不考虑。关于建立索引和查询也可以看看企业常用的lucene和solr。下面进入正题。
一:用户词库usrdict
拿到的用户词库usrdict.txt(699781个词汇)是从百度百科和互动百科中抽取的实体词条,从infobox中抽取结构化数据(三元组)。Usrdict中的词不一定会构成三元组,但三元组中的实体词一定在usrdict中。Usrdict中出现的一些字符错误如:

而放到html代码中进行显示,可以看到:
‎织金县第二中学
‎虚拟村庄
<<18岁29岁>>
<<S日记>>
<<上下策>>
<<乱世浮生>>
<<云之南>>
“一二•一”运动纪念馆
“三八”式步枪
“三高”防治日常按摩图典
……

说明是抽取时没有处理好生僻字和html符号的问题,如<>实际上对应<>、”对应“号等。可直接删除,后面有正确的词。这只是一小部分,删掉后还有699619个词,但实际上usrdict中还有一些无意义的词,例如最后一个词条“¥23.00元”,考虑这些也不是大部分,就先将就着用吧。

二:同音别字的纠错词典
为了建立同音别字的纠错词典,需要利用java集合中的HashMap。
首先把usrdict中的同音别字词全部整理处理,例如简单的一个testusrdict.text中的内容为:

要命
姚明
药名
耀明
林书豪
郭敬明
火箭
NBA
纽约尼克斯
自动化所
中科院
钟克媛
理想
立项
李湘

把字典中词的拼音转化出来,并命名为dicAddPY.txt:

  1. package CB_QR_Tools;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Iterator;
  6. import CB_QR_Dictionary.*;
  7. publicclass DictAddPinyin {
  8. publicstaticvoid main(String[] args) throws IOException
  9. {
  10. DataManage dm = new DataManage();
  11. FileWriter dicAddPY = new FileWriter(“CB_QR_Data\\dicAddPY.txt”);
  12. //读入原始usrdict
  13. ArrayList <UsrDict> usrDictWordlist = dm.readFile(“CB_QR_Data\\testusrdict.txt”, UsrDict.class);
  14. //开始进行拼音转换
  15. Iterator<UsrDict> it = usrDictWordlist.iterator();
  16. while (it.hasNext()){
  17. //把提取出来的词转化为字符串
  18. String itWord = it.next().toString();
  19. //把字符串转化为拼音
  20. String itPY = Chinese2PY.Ch2PY(itWord);
  21. System.out.println(itWord);
  22. dicAddPY.append(itPY + ” -> “ + itWord + “\r\n”);
  23. }
  24. dicAddPY.close(); //一定不要落下这行代码,否则无法正常输出
  25. }
  26. }

注:readFile中应该有一个针对UsrDict.class类型的正则表达式解析,对于usrdict比较简单,就是提取每行的词就行也可以写它的正则解析式:

 
  1. Pattern p = Pattern.compile(“(\\S.*)”, Pattern.MULTILINE);
  2. Matcher m = p.matcher(_text);

运行上面程序得到转化为拼音后的词典:
======================== dicAddPY.txt======================
yaoming -> 要命
yaoming -> 姚明
yaoming -> 药名
yaoming -> 耀明
linshuhao -> 林书豪
guojingming -> 郭敬明
huojian -> 火箭
NBA -> NBA
niuyuenikesi -> 纽约尼克斯
zidonghuasuo -> 自动化所
zhongkeyuan -> 中科院
zhongkeyuan -> 钟克媛
lixiang -> 理想
lixiang -> 立项
lixiang -> 李湘
======================== dicAddPY.txt======================

接下来要做的是把同音别字词做成链表形式,表头对应拼音,而后面是一串同音别字词,以空格隔开。例:yaoming -> 要命 姚明 药名 耀明。各同义词之间用空格符隔开。利用HashMap来做,以拼音yaoming作为key,后面的汉字符做为value值。Value可以是字符串也可以是链表。这里用字符串进行append连接吧。然后输出到文本文件中,生成同音别字纠错字典。这里要注意的就是”yaoming”和”yaoming ”是不一样的字符,会生成不一样的key值,所以一定要清除空格的影响。接下来就转成同音别字词典 homoDicAddPY.txt 。

  1. package CB_QR_Tools;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import CB_QR_Dictionary.DicAddPY;
  10. publicclass HomopDictPY {
  11. publicstaticvoid main(String[] args) throws IOException{
  12. DataManage dm = new DataManage();
  13. FileWriter homoDicPY = new FileWriter(“CB_QR_Data\\homoDicAddPY.txt”);
  14. //读入带拼音的用户字典dicAddPY
  15. ArrayList <DicAddPY> dictAddPYWordlist = dm.readFile(“CB_QR_Data\\dicAddPY.txt”, DicAddPY.class);
  16. //利用pinyin为hashkey,更新hashvalue
  17. Map HomopDictPY = new HashMap();
  18. //开始进行拼音转换
  19. Iterator<DicAddPY> it = dictAddPYWordlist.iterator();
  20. while (it.hasNext()){
  21. DicAddPY itDic = it.next();
  22. String PY = itDic.usrStringwordPY;
  23. String wordString = itDic.usrStringword;
  24. System.out.println(PY + ” -> “ + wordString);
  25. //如果已经包含这个key值,即拼音.则更新value,否则直接put
  26. if(HomopDictPY.containsKey(PY)){
  27. String updWord = HomopDictPY.get(PY).toString() +” “ + wordString;
  28. System.out.println(updWord);
  29. HomopDictPY.put(PY, updWord);
  30. }
  31. else {
  32. HomopDictPY.put(PY, wordString);
  33. }
  34. }
  35. //全部保存到HashSet中之后就开始往文件中输出了,要遍历所有的
  36. Set<String> mapSet = HomopDictPY.keySet();
  37. Iterator<String> itor = mapSet.iterator();
  38. while (itor.hasNext()) {
  39. String itorkey = itor.next();
  40. String words = HomopDictPY.get(itorkey).toString();
  41. //开始保存入文件中去
  42. homoDicPY.append(itorkey + ” -> “ + words + “\r\n”);
  43. }
  44. homoDicPY.close();
  45. }
  46. }

注:readFile中应该有一个针对DicAddPY.class类型的正则表达式解析,对于dicAddPY.txt 中的每行yaoming -> 要命 ,分别把pinyin和中文字符提取出来,对应的正则表达式应该是:

 
  1. Pattern p = Pattern.compile(“(\\S.*) -&gt; \\s*(\\S.*)”, Pattern.MULTILINE);
  2. Matcher m = p.matcher(_text);

运行上面程序得到转化为同音别字词典:

======================== homoDicAddPY.txt======================
niuyuenikesi -> 纽约尼克斯
huojian -> 火箭
lixiang -> 理想 立项 李湘
zhongkeyuan -> 中科院 钟克媛
NBA -> NBA
linshuhao -> 林书豪
guojingming -> 郭敬明
zidonghuasuo -> 自动化所
yaoming -> 要命 姚明 药名 耀明
======================== homoDicAddPY.txt======================

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>