package org.autumn.kettle;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
/**
* 同音字查询。<br/>
*
* 根据中文查拼音,考虑多音字的情况,一个中文会对应多个拼音,之后根据拼音去查中文。
*
* @author sunny
*
*/
public class ChineseSoundex {
public static Map<String, String> chineseMap = new HashMap<String, String>();
public static Map<String, String> pinyinMap = new HashMap<String, String>();
public static final String SEPARATOR = "_";
static {
File file = new File("src/GB2312汉字拼音对照表7809字.txt");
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
String chinese = tempString.substring(0, 1);
String pinyin = tempString.substring(2, tempString.length());
if (chineseMap.get(chinese) == null) {
chineseMap.put(chinese, pinyin);
} else {
chineseMap.put(chinese, chineseMap.get(chinese) + SEPARATOR
+ pinyin);
}
if (pinyinMap.get(pinyin) == null) {
pinyinMap.put(pinyin, chinese);
} else {
pinyinMap.put(pinyin, pinyinMap.get(pinyin) + SEPARATOR
+ chinese);
}
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
private boolean soundex(String str1, String str2) {
List<String> thisList = getPinyin(str1);
List<String> thatList = getPinyin(str2);
for (String that : thatList) {
if (thisList.contains(that))
return true;
}
return false;
}
private static List<String> getPinyin(String chinese) {
List<String> pinyins = new ArrayList<String>();
String pinyin = chineseMap.get(chinese);
if (pinyin.contains(SEPARATOR)) {
String[] strs = pinyin.split(SEPARATOR);
for (int i = 0; i < strs.length; i++) {
pinyins.add(strs[i]);
}
} else {
pinyins.add(pinyin);
}
return pinyins;
}
@Test
public void testSoundex1() {
assertTrue(soundex("真", "甄"));
assertFalse(soundex("真", "振"));
}
@Test
public void testSoundex2() {
assertTrue(soundex("行", "杭"));
assertTrue(soundex("行", "形"));
}
public static void main(String[] args) {
System.out.println(soundex("行"));
}
private static List<String> soundex(String chinese) {
List<String> result = new ArrayList<String>();
List<String> pinyins = getPinyin(chinese);
for (String pinyin : pinyins) {
result.addAll(getChinese(pinyin, chinese));
}
return result;
}
private static List<String> getChinese(String pinyin, String searchChinese) {
List<String> result = new ArrayList<String>();
String chineses = pinyinMap.get(pinyin);
if (chineses.contains(SEPARATOR)) {
String[] strs = chineses.split(SEPARATOR);
for (int i = 0; i < strs.length; i++) {
if (!searchChinese.equals(strs[i]))
result.add(strs[i]);
}
} else {
if (!searchChinese.equals(chineses))
result.add(chineses);
}
return result;
}
}
遗留问题,多音字怎么转拼音?有好的解决方案请留言,谢谢。
分享到:
相关推荐
Oracle 中同音字 查询 直接导入项目即可使用 执行里面sql
数字五笔中文输入系统2013 十个数字,五种笔画... 强大的软件功能,智能记忆,标点自动识别,全鼠标输入,词组连续联想,同音字查询,简体转繁体,支持GBK二万余汉字输入! 最新功能:完美支持Vista系统,支持5万超大词
强大的软件功能,智能记忆,标点自动识别,全鼠标输入,词组连续联想,同音字查询,简体转繁体,支持GBK二万余汉字输入! 最新功能:完美支持Vista系统,支持5万超大词组,支持连续词组输入,支持在线造词!优化...
2、姓名分析,有“个人姓名分析”和“公司商号名分析”,另外还有“单字笔画数”、“笔画查字”、“同音字查询”、“姓名学字义查询”、“字典字义查询”、“姓名笔画数分析”的多种查询功能。 3、六壬金...
<br> 强大的软件功能,智能记忆,标点自动识别,全鼠标输入,词组连续联想,同音字查询,简体转繁体,支持GBK二万余汉字输入! 最新功能:完美支持Vista系统,支持5万超大词组,支持连续词组输入,支持在线...
2、姓名分析,有“个人姓名分析”和“公司商号名分析”,另外还有“单字笔画数”、“笔画查字”、“同音字查询”、“姓名学字义查询”、“字典字义查询”、“姓名笔画数分析”的多种查询功能。 3、六壬金...
10、同音字查询 11、速查万事通 12、全国最多单字(75306个) 13、最多词组(20多万条) 14、汉字笔顺动画演示 15、汉字古今汉语、成语、英文显示 16、自造联想句。并可上传网上到任何电脑上用 17、自造词。并可上传...
4.2.2同音字查询………………………………………………………………………………………………….. 4.2.3成绩录入模块………………………………………………………………………………………………. 4.2.4成绩管理……...
有同音字识别功能,同音错别字同样可以识别,如:“玫瑰”和“没鬼”同样会搜到“玫瑰花”。查看图片时,点击列表中小图片可以查看大图片,查看大图片时,支持双指缩放,双击缩放,双指旋转。在花语查询界面点击手动...
有同音字识别功能,同音错别字同样可以识别,如:“玫瑰”和“没鬼”同样会搜到“玫瑰花”。查看图片时,点击列表中小图片可以查看大图片,查看大图片时,支持双指缩放,双击缩放,双指旋转。在花语查询界面点击手动...
】等数十个同音字来供用户选择输入,当你对着电脑说出【学习】时,语音模糊查询区就会自动显示【学习、血洗…】等数组同音词来供用户选择输入,如果供选的同音字词过多时可按【-/ 】键进行翻页查询。输入文字时:只...
***以上四个查询用于校对名字出现形近或者同音字的记录,2的为查询结果,供教师校对 查询 高二1重名**高二理科花名册各姓名出现次数 查询 高二1重名人 **高二理科花名册中同名的学生名单 查询 高二理科名单 **...
查找类似的汉字,同音异义词,同义词! 该解决方案由以下列出的几个模块组成。 模组 聚合器 这是一个控制台应用程序,它结合了多个词典以及数据,并生成各种聚合数据,这些数据可随时在后端使用。 基本上只运行一...
这样查询的时候也简单 根据拼音父建直接可以查到这个拼音组合下所有的同音字 为了字库入库方便 我顺便还写了一个入库工具 呵呵 这个就比较简单了 输入流 把同一个拼音组合的汉字放一个文本中 然后把这个文本中...
Collins Cobuild English Dictionary 是Pocket PC上最出色的英语含义查询词典,15年精心打造,超过25000个单词,Collins Cobuild英语词典堪称现代英语最全面、权威的向导。 <br>柯林斯COBUILD英语词典 由英国...
Query有多种纠错策略,包括拼音纠错和编辑距离纠错,模糊音形近字二次纠错等其他纠错策略等。同音策略是用户输入的错误query和候选纠错query有相同的拼音。编辑距离策略就是错误query和候选query之间编
-动态计算Google学术搜索页面上最常见的书目索引-可以编写自己喜欢的书目公式-可以自动清除计算得出的索引中的自我和虚假引文-可以在Google学术搜索被截断为前4个时完成作者列表作者-可以根据可能的作者的同音异义来...