`
cutesunshineriver
  • 浏览: 200541 次
  • 性别: 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数据库中,同音字查询是一个特殊的需求,通常用于处理中文字符的相似性匹配,例如用户输入可能存在拼写错误或者使用了同音字。Oracle提供了多种方式来实现这一功能,下面将详细介绍如何在Oracle中进行同音字...

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

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

    九方输入法 For Android v1.50.zip

    总的来说,九方输入法For Android v1.50以其独特的繁简转换、同音字查询功能,以及人性化的用户体验,展示了在移动设备上中文输入的智能化与便捷性。无论是在工作、学习还是日常生活中,它都是提升中文输入效率的好...

    数字五笔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、自造词。并可上传...

    物流行业网站建设方案样本.doc

    此外,同音字查询功能简化了与客户之间的沟通。 6. **数据分析与决策支持**:强大的数据查询和分析功能,支持自定义查询条件,为管理层提供决策依据。同时,记录每一次的数据修改,便于业务审计和问题排查。 7. **...

    学籍管理系统设计以及实现.doc

    - 同音字查询:支持模糊搜索,方便查找相似姓名的学生信息。 - 成绩录入模块:提供简便的录入和修改成绩的功能。 - 成绩管理:对成绩数据进行统计、分析和报告。 - 学籍处理:包括注册、转学、休学等学籍变动的处理...

    物流行业信息化整体解决方案探析.docx

    7. **同音字查询功能** - 方便操作员快速查找相关信息,提高查询速度。 8. **强大的数据查询功能** - 支持多种条件组合查询,满足不同的业务需求。 9. **信息修改管理** - 可追踪每一次数据修改的过程,确保数据...

    五笔编码查询工具

    2. 减少错误:五笔编码具有唯一性,避免了因拼音输入法的同音字引起的错误,提高了文字工作的准确性。 3. 节省精力:对于长期使用电脑的人来说,减少手指在键盘上的移动距离,减轻了手部疲劳,有利于健康。 4. ...

    花语查询程序

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

    古代汉语之字典辞书查询[归类].pdf

    直音法用同音字注音,但存在局限性,当没有同音字或者同音字难认时,这种方法就不太适用。反切法是古代最普遍的注音方式,通过两个字的组合表示被注音字的读音,上字代表声母,下字代表韵母和声调,但反切对于不熟悉...

    模糊查询

    4. **拼音和同音字**:在中国,模糊查询常常结合汉语拼音和同音字功能,即便用户输入的是拼音或同音词,也能找到相应的汉字信息。例如,查询"shushu"可能返回"叔叔"的相关信息。 5. **模糊排序和评分**:在返回模糊...

    中文信息检索系统的模糊匹配算法研究和实现

    中文信息检索系统的模糊匹配算法研究和实现主要聚焦于解决用户在使用拼音输入法时,因同音字/近音字替换而导致的输入与数据库中条目之间存在的局部偏差问题。以下是针对标题、描述、标签和部分内容中提及的知识点的...

    汉字代码查询[整理].pdf

    第一级汉字(16-55区的汉字)按照拼音字母顺序进行排列,同音字以笔形顺序横、竖、撇、捺、折为序,起笔相同的按第二笔,依次类推;第二级汉字(56-87区的汉字)按照部首顺序进行排列。 在这份文件中,多音字仅在表...

    花语查询软件 公测版

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

Global site tag (gtag.js) - Google Analytics