android实现汉字转拼音功能 带多音字识别

android 汉字转拼音带多音字识别功能,供大家参考,具体内容如下

问题来源

在做地名按首字母排序的时候出现了这样一个bug。长沙会被翻译拼音成zhangsha,重庆会被翻译拼音成zhong qing。于是排序出了问题。

汉字转拼音库和多音字识别库
1.多音字对应的词汇库
2.文字的二进制大小对应的拼音库

关键代码

1.我在这里首先将要转化的文字转化成对应的”gb2312”编码。汉字转化成二进制编码一般占两个字节,如果一个字节返回字符,如果是两个字节算一下偏移量。代码如下

/** * 汉字转成ASCII码 * * @param chs * @return */ private int getChsAscii(String chs) { int asc = 0; try { byte[] bytes = chs.getBytes("gb2312"); if (bytes == null || bytes.length > 2 || bytes.length <= 0) { throw new RuntimeException("illegal resource string"); } if (bytes.length == 1) { asc = bytes[0]; } if (bytes.length == 2) { int hightByte = 256 + bytes[0]; int lowByte = 256 + bytes[1]; asc = (256 * hightByte + lowByte) - 256 * 256; } } catch (Exception e) { System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" + e); } return asc; }

2.将单个汉字获取的拼音再和多音字库的hashMap进行比较,代码如下:

public String getSellingWithPolyphone(String chs){ if(polyphoneMap != null && polyphoneMap.isEmpty()){ polyphoneMap = initDictionary(); } String key, value, resultPy = null; buffer = new StringBuilder(); for (int i = 0; i < chs.length(); i++) { key = chs.substring(i, i + 1); if (key.getBytes().length >= 2) { value = (String) convert(key); if (value == null) { value = "unknown"; } } else { value = key; } resultPy = value; String left = null; if(i>=1 && i+1 <= chs.length()){ left = chs.substring(i-1,i+1); if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(left)){ resultPy = value; } } // if(chs.contains("重庆")){ String right = null; //向右多取一个字,例如 [长]沙 if(i<=chs.length()-2){ right = chs.substring(i,i+2); if(polyphoneMap.containsKey(right)){ resultPy = polyphoneMap.get(right); } } // } String middle = null; //左右各多取一个字,例如 龙[爪]槐 if(i>=1 && i+2<=chs.length()){ middle = chs.substring(i-1,i+2); if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(middle)){ resultPy = value; } } String left3 = null; //向左多取2个字,如 芈月[传],列车长 if(i>=2 && i+1<=chs.length()){ left3 = chs.substring(i-2,i+1); if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(left3)){ resultPy = value; } } String right3 = null; //向右多取2个字,如 [长]孙无忌 if(i<=chs.length()-3){ right3 = chs.substring(i,i+3); if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(right3)){ resultPy = value; } } buffer.append(resultPy); } return buffer.toString(); }

3.将asserts文件内容解析生成HashMap列表.

public HashMap<String, String> initDictionary(){ String fileName = "py4j.dic"; InputStreamReader inputReader = null; BufferedReader bufferedReader = null; HashMap<String, String> polyphoneMap = new HashMap<String, String>(); try{ inputReader = new InputStreamReader(MyApplication.mContext.getResources().getAssets().open(fileName),"UTF-8"); bufferedReader = new BufferedReader(inputReader); String line = null; while((line = bufferedReader.readLine()) != null){ String[] arr = line.split(PINYIN_SEPARATOR); if(isNotEmpty(arr[1])){ String[] dyzs = arr[1].split(WORD_SEPARATOR); for(String dyz: dyzs){ if(isNotEmpty(dyz)){ polyphoneMap.put(dyz.trim(),arr[0]); } } } } }catch(Exception e){ e.printStackTrace(); }finally{ if(inputReader != null){ try { inputReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(bufferedReader != null){ try { bufferedReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return polyphoneMap; }

github源码下载:https://github.com/loveburce/ChinesePolyphone.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-30 11:15:14

android实现汉字转拼音功能 带多音字识别的相关文章

C#汉字转拼音(支持多音字)

原文 C#汉字转拼音(支持多音字) 阅读目录 首先在nuget引用对应的包 简单的demo 汉字转拼音类封装 源码分享 之前由于项目需要,中间需要一个汉字转拼音和首拼的功能来做查询,感觉这种功能基本已经成熟化了,于是查找了相关的代码,首先引入眼帘的是下面两篇文章 1.C# 汉字转拼音(支持GB2312字符集中所有汉字) 2.[干货]JS版汉字与拼音互转终极方案,附简单的JS拼音输入法 感谢两位博主,写的比较全也很详细,都有提供源码,大家可以参考下. 由于考虑到接口的需要,于是参考了 第一篇,文章

C#汉字转拼音功能类

此代码属改造而来,没有太深的技术难度,仅仅是排除了原来代码的错误.增加了一些常规需求.目前此类可以实现的功能如下: 1.对中文字符串进行拼音转换的基本功能 2.支持并可自定义拼音单词间的分隔符 3.支持并可自定义是否将拼音单词首字母大写 4.支持并可自定义多音词预定音 5.支持并可自定义转换过程中要排除解析的字符,例如中文标点 输出示例: 引发 system.Web.UI.Control.Init 事件以对页进行初始化 Yin-Fa system.Web.UI.Control.Init Shi-

文件一键上传、汉字转拼音、excel文件上传下载功能模块的实现

----------------------------------------------------------------------------------------------[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52557755作者:朱培      ID:sdksdk0      ------------------------------------------------

Android 汉字转拼音之JNI篇

  package com.tool.hz2py; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { protected Hz2py hz2py; @Override protected void onCreate(Bundle sa

在PostgreSQL中实现按拼音、汉字、拼音首字母搜索的例子

在PostgreSQL中实现按拼音.汉字.拼音首字母搜索的例子 作者 digoal 日期 2016-11-09 标签 PostgreSQL , 拼音 , 中文分词 , tsvector , 拼音首字母 , hmm , 词库 背景 PostgreSQL有很多特性是可以提升开发效率,提高生产力的. 在前端页面中,搜索是一个非常常用的功能,例如淘宝首页的搜索. 为了提升用户体验,用户可以按拼音首字母进行搜索,按中文单词搜索,或者按拼音的全部进行搜索. 又比如家里的电视盒子,因为没有实体键盘,按拼音首字

C# 汉字转拼音声调 例如 lì rú

问题描述 C#汉字转拼音声调例如lìrú 解决方案 解决方案二:多音字处理很麻烦解决方案三:那是要有词典的仅转拼音,字典就够了.带声调就需要有词典,甚至还要加语义分析比如

iOS 汉字的拼音_IOS

废话不多说,直接给大家贴关键代码了. 具体代码如下所示: #import <Foundation/Foundation.h> @interface NSString (Utils) /** * 汉字的拼音 * * @return 拼音 */ - (NSString *)pinyin; @end #import "NSString+Utils.h" @implementation NSString (Utils) //汉字的拼音 - (NSString *)pinyin{ N

[原创代码]汉字转拼音 /成语词典/简体繁体在线互转

汉字|拼音|原创|在线|拼音|原创|在线 工作过程中随手写的 汉字转拼音 ,演示地址: http://www.facesun.cn/portal/demo/hz2py.asp 成语词典[除了解释,还带拼音\出处\造句],演示地址: http://www.facesun.cn/portal/demo/cycx.asp 简体繁体在线互转,演示地址: http://www.facesun.cn/portal/demo/jft.asp 主要是工作中一些想法的实现 第一个派上了大用场第二个没啥用就是写了玩

利用IFELanguage分隔中文语句并对汉字加注拼音

这篇文档是讲如何利用IFELanguage接口实现对中文语句的分隔,并对词语和字加注拼音的方法. 首先感谢一下Zswang(伴水)兄弟,他的无私奉献精神和对Windows的深入研究值得我们每一个人学习.每次找到好东东他总是给我一份,包括这个IFELanguage接口资料.最初的资料源自一个日本网站,源代码是用VC8写的,Zswang(伴水)将其改写为一个适用于Delphi下的版本.原C++代码经ccrun(老妖)略作修改,在BCB6下调试通过.原VC8的版本和BCB6还有Zswang(伴水)写的