`
cutesunshineriver
  • 浏览: 196442 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

同音字查询

 
阅读更多
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;
	}

}


遗留问题,多音字怎么转拼音?有好的解决方案请留言,谢谢。
1
2
分享到:
评论

相关推荐

    oracle 同音字查询

    Oracle 中同音字 查询 直接导入项目即可使用 执行里面sql

    数字五笔特别版2013(单手输入可达百字分)官方原版破解补丁

    数字五笔中文输入系统2013 十个数字,五种笔画... 强大的软件功能,智能记忆,标点自动识别,全鼠标输入,词组连续联想,同音字查询,简体转繁体,支持GBK二万余汉字输入! 最新功能:完美支持Vista系统,支持5万超大词

    数字五笔2013 安装破解版

    强大的软件功能,智能记忆,标点自动识别,全鼠标输入,词组连续联想,同音字查询,简体转繁体,支持GBK二万余汉字输入! 最新功能:完美支持Vista系统,支持5万超大词组,支持连续词组输入,支持在线造词!优化...

    南方综合排盘程序8.4

    2、姓名分析,有“个人姓名分析”和“公司商号名分析”,另外还有“单字笔画数”、“笔画查字”、“同音字查询”、“姓名学字义查询”、“字典字义查询”、“姓名笔画数分析”的多种查询功能。 3、六壬金...

    数字五笔 v2007.2.1

    &lt;br&gt; 强大的软件功能,智能记忆,标点自动识别,全鼠标输入,词组连续联想,同音字查询,简体转繁体,支持GBK二万余汉字输入! 最新功能:完美支持Vista系统,支持5万超大词组,支持连续词组输入,支持在线...

    南方综合排盘程序

    2、姓名分析,有“个人姓名分析”和“公司商号名分析”,另外还有“单字笔画数”、“笔画查字”、“同音字查询”、“姓名学字义查询”、“字典字义查询”、“姓名笔画数分析”的多种查询功能。 3、六壬金...

    新方码输入法

    10、同音字查询 11、速查万事通 12、全国最多单字(75306个) 13、最多词组(20多万条) 14、汉字笔顺动画演示 15、汉字古今汉语、成语、英文显示 16、自造联想句。并可上传网上到任何电脑上用 17、自造词。并可上传...

    学籍管理系统毕业论文

    4.2.2同音字查询………………………………………………………………………………………………….. 4.2.3成绩录入模块………………………………………………………………………………………………. 4.2.4成绩管理……...

    花语查询程序

    有同音字识别功能,同音错别字同样可以识别,如:“玫瑰”和“没鬼”同样会搜到“玫瑰花”。查看图片时,点击列表中小图片可以查看大图片,查看大图片时,支持双指缩放,双击缩放,双指旋转。在花语查询界面点击手动...

    花语查询软件 公测版

    有同音字识别功能,同音错别字同样可以识别,如:“玫瑰”和“没鬼”同样会搜到“玫瑰花”。查看图片时,点击列表中小图片可以查看大图片,查看大图片时,支持双指缩放,双击缩放,双指旋转。在花语查询界面点击手动...

    云龙语音输入法 v2013 Build 0806.zip

    】等数十个同音字来供用户选择输入,当你对着电脑说出【学习】时,语音模糊查询区就会自动显示【学习、血洗…】等数组同音词来供用户选择输入,如果供选的同音字词过多时可按【-/ 】键进行翻页查询。输入文字时:只...

    基于access的学生数据库管理

    ***以上四个查询用于校对名字出现形近或者同音字的记录,2的为查询结果,供教师校对 查询 高二1重名**高二理科花名册各姓名出现次数 查询 高二1重名人 **高二理科花名册中同名的学生名单 查询 高二理科名单 **...

    niai:查找类似的汉字,同音异义词,同义词!

    查找类似的汉字,同音异义词,同义词! 该解决方案由以下列出的几个模块组成。 模组 聚合器 这是一个控制台应用程序,它结合了多个词典以及数据,并生成各种聚合数据,这些数据可随时在后端使用。 基本上只运行一...

    手机T9拼音输入法模仿器

    这样查询的时候也简单 根据拼音父建直接可以查到这个拼音组合下所有的同音字 为了字库入库方便 我顺便还写了一个入库工具 呵呵 这个就比较简单了 输入流 把同一个拼音组合的汉字放一个文本中 然后把这个文本中...

    柯林斯英语词典 Pocket PC上最出色的英语含义查询词典

    Collins Cobuild English Dictionary 是Pocket PC上最出色的英语含义查询词典,15年精心打造,超过25000个单词,Collins Cobuild英语词典堪称现代英语最全面、权威的向导。 &lt;br&gt;柯林斯COBUILD英语词典 由英国...

    QueryCorrection:self complemented SpellCorrection based pinyin similairity, edit distance ,基于拼音相似度与编辑距离的查询纠错

    Query有多种纠错策略,包括拼音纠错和编辑距离纠错,模糊音形近字二次纠错等其他纠错策略等。同音策略是用户输入的错误query和候选纠错query有相同的拼音。编辑距离策略就是错误query和候选query之间编

    Google Chrome:trade_mark:学者H指数计算器「Scholar H-Index Calculator for Google Chrome:trade_mark:」-crx插件

    -动态计算Google学术搜索页面上最常见的书目索引-可以编写自己喜欢的书目公式-可以自动清除计算得出的索引中的自我和虚假引文-可以在Google学术搜索被截断为前4个时完成作者列表作者-可以根据可能的作者的同音异义来...

Global site tag (gtag.js) - Google Analytics