题外话:搜狗实验室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:
- package CB_QR_Tools;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Iterator;
- import CB_QR_Dictionary.*;
- publicclass DictAddPinyin {
- publicstaticvoid main(String[] args) throws IOException
- {
- DataManage dm = new DataManage();
- FileWriter dicAddPY = new FileWriter(“CB_QR_Data\\dicAddPY.txt”);
- //读入原始usrdict
- ArrayList <UsrDict> usrDictWordlist = dm.readFile(“CB_QR_Data\\testusrdict.txt”, UsrDict.class);
- //开始进行拼音转换
- Iterator<UsrDict> it = usrDictWordlist.iterator();
- while (it.hasNext()){
- //把提取出来的词转化为字符串
- String itWord = it.next().toString();
- //把字符串转化为拼音
- String itPY = Chinese2PY.Ch2PY(itWord);
- System.out.println(itWord);
- dicAddPY.append(itPY + ” -> “ + itWord + “\r\n”);
- }
- dicAddPY.close(); //一定不要落下这行代码,否则无法正常输出
- }
- }
注:readFile中应该有一个针对UsrDict.class类型的正则表达式解析,对于usrdict比较简单,就是提取每行的词就行也可以写它的正则解析式:
- Pattern p = Pattern.compile(“(\\S.*)”, Pattern.MULTILINE);
- 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 。
- package CB_QR_Tools;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- import CB_QR_Dictionary.DicAddPY;
- publicclass HomopDictPY {
- publicstaticvoid main(String[] args) throws IOException{
- DataManage dm = new DataManage();
- FileWriter homoDicPY = new FileWriter(“CB_QR_Data\\homoDicAddPY.txt”);
- //读入带拼音的用户字典dicAddPY
- ArrayList <DicAddPY> dictAddPYWordlist = dm.readFile(“CB_QR_Data\\dicAddPY.txt”, DicAddPY.class);
- //利用pinyin为hashkey,更新hashvalue
- Map HomopDictPY = new HashMap();
- //开始进行拼音转换
- Iterator<DicAddPY> it = dictAddPYWordlist.iterator();
- while (it.hasNext()){
- DicAddPY itDic = it.next();
- String PY = itDic.usrStringwordPY;
- String wordString = itDic.usrStringword;
- System.out.println(PY + ” -> “ + wordString);
- //如果已经包含这个key值,即拼音.则更新value,否则直接put
- if(HomopDictPY.containsKey(PY)){
- String updWord = HomopDictPY.get(PY).toString() +” “ + wordString;
- System.out.println(updWord);
- HomopDictPY.put(PY, updWord);
- }
- else {
- HomopDictPY.put(PY, wordString);
- }
- }
- //全部保存到HashSet中之后就开始往文件中输出了,要遍历所有的
- Set<String> mapSet = HomopDictPY.keySet();
- Iterator<String> itor = mapSet.iterator();
- while (itor.hasNext()) {
- String itorkey = itor.next();
- String words = HomopDictPY.get(itorkey).toString();
- //开始保存入文件中去
- homoDicPY.append(itorkey + ” -> “ + words + “\r\n”);
- }
- homoDicPY.close();
- }
- }
注:readFile中应该有一个针对DicAddPY.class类型的正则表达式解析,对于dicAddPY.txt 中的每行yaoming -> 要命 ,分别把pinyin和中文字符提取出来,对应的正则表达式应该是:
- Pattern p = Pattern.compile(“(\\S.*) -> \\s*(\\S.*)”, Pattern.MULTILINE);
- Matcher m = p.matcher(_text);
运行上面程序得到转化为同音别字词典:
======================== homoDicAddPY.txt======================
niuyuenikesi -> 纽约尼克斯
huojian -> 火箭
lixiang -> 理想 立项 李湘
zhongkeyuan -> 中科院 钟克媛
NBA -> NBA
linshuhao -> 林书豪
guojingming -> 郭敬明
zidonghuasuo -> 自动化所
yaoming -> 要命 姚明 药名 耀明
======================== homoDicAddPY.txt======================