一种手持设备通讯录的拼音反查方法
技术领域
本发明涉及一种拼音反查方法,尤其涉及一种手持设备通讯录的拼音反查方法,属于信息技术处理领域。
背景技术
随着手持设备硬件性能的进一步提升,和市场日益蓬勃的发展,手持设备第三方软件开发也在蓬勃发展。
通讯录作为移动通讯的核心功能,在人们的日常生活中发挥巨大的作用。目前手持设备通讯录中拼音反查技术只能根据汉字找到其读音,并不能区分出拼音是在姓中使用,还是在名中使用,还是普通使用,从而不利于姓名拼音的正确显示和查找。
同时,中文人名作为特别名词,其中有很大一部分汉字读音与许多与日常生活中的读音存在差异,需要专门的拼音反查词库支持。例如“单”的读音有三个“dan”,“shan”,“chan”,日常中一般使用发音“dan”,人名中使用发音“shan”,而发音“chan”只出现在单词“单于”中,因此需要对三个发音进行分级,以实现在不同场景下的使用,然而,现有的通讯录中没有给出对此问题的解决方案。
另外,人名中出现一些生僻字如“镕”,“赑”,“燚”等不包含在常用汉字字符集GB2312或GBK中,如果使用更大的字符集如GB18030,或者Unicode中的汉字,又会占用太多的空间。
由于手持设备的空间限制和运算性能要求,需要一个占用空间小,能够准确给出姓名汉字读音拼音反查库,针对手持设备的具体特点,一个完善的,完整的人名拼音反查方案亟待出现。
发明内容
针对现有技术中存在的技术问题,本发明的目的在于提供一种手持设备通讯录的拼音反查方法,实现对通讯录中人名的快速、准确查找。
本发明的方法主要是通过对手持设备通讯录的人名中使用的汉字进行统计,抽取人名常用汉字,然后为人名常用汉字中的多音字进行分级,最后对指定汉字进行拼音反查的同时返回各个拼音的分级信息。
本发明的技术方案为:
一种手持设备通讯录的拼音反查方法,其步骤为:
1)建立一汉字数组,用于存储人名中的汉字;
2)从拼音词库中获取所述汉字数组中每个具有拼音的汉字的拼音;
3)根据获取的拼音标注相应的汉字并标注每个拼音的属性信息,得到一人名拼音词库;
4)根据人名拼音库建立一拼音反查词库,所述拼音反查词库的字段包括:版本号、人名拼音词库中汉字个数、汉字节点数据、拼音节点数据;其中汉字节点的字段包括:汉字的国际通用字符集值、每个汉字拼音个数、拼音存储偏移量,拼音节点的字段包括:拼音字符串、拼音属性;
5)根据输入的汉字查找所述拼音反查词库的汉字节点,并根据汉字节点的拼音存储偏移量查找拼音字符串的存储位置,返回汉字的拼音。
进一步的,所述汉字数组的建立方法为:读取人名词库中的每一个汉字,如果该汉字没有出现在所述汉字数组中,则将其添加到所述汉字数组;读取GB2312字符表文件中的每一个汉字,如果该汉字没有出现在所述汉字数组中,则将其添加到所述汉字数组。
进一步的,所述人名拼音词库的拼音属性包括:日常使用、名中日常使用、姓中日常使用、不常用、专用。
进一步的,对于拼音属性为专用的拼音,标注该拼音的专用词组或上下文。
进一步的,所述拼音节点的字段还包括:专用拼音的词组。
进一步的,所述拼音节点的字段中拼音属性包括:常用拼音、不常用拼音、专用词组的拼音、名常用拼音、姓常用拼音。
进一步的,所述拼音的属性中每一属性设有一属性值,其中:常用的属性值>不常用拼音的属性值>名常用拼音的属性值>姓常用拼音的属性值>专用词组的拼音的属性值。
进一步的,所述汉字的国际通用字符集值为2字节整数类型、所述每个汉字拼音个数为4字节整数类型、所述拼音存储偏移量为4字节整数类型。
进一步的,采用折半查找存储每个汉字的所述汉字节点信息,并根据汉字节点的拼音存储偏移量查找拼音数据的存储位置。
进一步的,根据当前汉字使用的场景和汉字所属汉字字符串返回当前汉字的拼音,其方法为:
a)如果使用场景为姓查找,对于查找到的若干个拼音字符串,将拼音字符串属性为姓常用拼音且属性值不为零的拼音字符串返回,否则将拼音字符串属性值最大的拼音字符串返回;
b)如果使用场景为名查找,对于对于查找到的若干个拼音字符串,将拼音字符串属性为名常用拼音且属性值不为零的拼音字符串返回,否则将拼音字符串属性值最大的拼音字符串返回;
c)如果为普通汉字的查找,对于查找到的若干个拼音字符串,将拼音字符串属性为专用词组的拼音且属性值不为零的拼音字符串返回,否则将拼音字符串属性值最大的拼音字符串返回。
与现有技术相比,本发明的积极效果为:
手持设备现有的拼音反查技术只能根据汉字找到其读音,但不能区分出拼音是在姓中使用,还是在名中使用,还是普通使用,不利于姓名拼音的正确显示和查找。另外由于手持设备的空间限制和运算性能要求,需要一个占用空间小,能够准确给出姓名汉字读音拼音反查库。本发明提供的解决方案从统计上给出人名常用汉字库,并对汉字的拼音进行分级,有效解决手持设备拼音反查面临的问题。
具体实施方式
下面对本发明的实施方式进行进一步的描述:
1.人名中所使用的汉字的统计,操作方法:
建立汉字数组。读取人名词库中的每一个汉字,如果该汉字没有出现在汉字数组中,将其添加到汉字数组。以同样的方法读取GB2312字符表文件,将其中的每一个汉字添加到汉字数组。
2.人名汉字多音字拼音分级
从拼音词库中获取第一步得到数组中汉字的每一个拼音,去掉没有拼音的字符。使用人工标注每一个拼音的属性,生成表1格式的数据:
表1:人名拼音词库的文件结构
3.根据拼音分级建立拼音反查词库(使用C语言描述存储结构)
人名专用拼音词库建立后不用修改,而且结构简单,易于使用文件或者数组作为持久存储容器,减少存储空间,提高移植性。使用表2~表5的格式建立拼音反查词库(拼音反查算法见步骤4)
表2:拼音词库文件结构
字段 |
类型 |
说明 |
version |
int |
版本 |
wordCount |
int |
词库中汉字个数 |
pinyinCount |
int |
词库中汉字拼音条目个数 |
wordBlocks |
WordBlock |
汉字节点,个数wordCount |
字段 |
类型 |
说明 |
pinyinBlocks |
PinyinBlock |
拼音节点,个数pinyinCount |
表3:汉字节点(WordBlock)
字段 |
类型 |
说明 |
word |
short |
汉字的unicode(国际通用字符集)值 |
pinyinCount |
short |
该汉字拼音个数 |
pinyinOffset |
int |
拼音存储偏移量 |
表4:拼音节点(PinyinBlock)
字段 |
类型 |
说明 |
pinyin |
char* |
拼音字符串 |
attribute |
int |
属性,按位表示拼音的优先级 |
context |
short* |
专用拼音的词组, |
表5:拼音属性(PinyinAttribute, 枚举类型)
枚举 |
值 |
说明 |
common |
0x40 |
常用拼音 |
lessCommon |
0x10 |
不常用拼音 |
reserved |
0x08 |
专用词组的拼音 |
givenName |
0x04 |
名常用拼音, |
familyName |
0x02 |
姓常用拼音 |
notUsed |
0x01 |
|
4.人名汉字拼音反查算法
数据输入为要查找拼音的汉字,作为一个函数实现,供其他模块调用。 从步骤3中的存储结构可知WordBlock节点大小固定,且连续存储,因此可以使用折半(参考:折半查找算法:http://en.wikipedia.org/wiki/Binary_search_algorithm)查找存储该汉字信息的WordBlock,并根据WordBlock的pinyinOffset域找到拼音数据存储的位置。
示例代码:
int getPinyin(short word,PinyinBlock*blocks,int maxCount)
{
int l=0;
int h=wordCount-1;
int m=0;
while(l<=h)
{
m=(l+h) /2;
if(word>wordBlocks[m].word)
l=m+1;
else if(word<wordBlocks[m].word)
h=m-1;
else
break;
}
if(word==iWordBlock[m].word)
{
int count=Max(iWordBlock[m].pinyinCount,maxCount);
for(;i<count;i++)
{
blocks[i]=getPinyinOfWrod(iWordBlock[m],i);
}
return i;
}
return 0;
}
5.使用拼音的优先级
根据当前汉字使用的场景如姓、名、普通短语等(使用PinyinAttribute标识)和汉字所属汉字字符串从当前汉字所有拼音(PinyinBlock)中获取取最优的拼音。可以有以下几种使用方法:
a.获取姓名中姓部分汉字拼音:
使用步骤4的算法获取汉字的拼音,对于每一个拼音,如果(attribute&familyName)非零,该拼音即为当前汉字的拼音,否则使用attribute值最大拼音作为当前汉字的拼音。
b.获取姓名中名部分汉字的拼音
使用步骤4的算法获取汉字的拼音,对于每一个拼音,如果(attribute&givenName)非零,该拼音即为当前汉字的拼音,否则使用attribute值最大拼音作为当前汉字的拼音。
c.获取普通汉字的拼音
使用步骤4的算法获取汉字的拼音,对于每一个拼音,如果(attribute&reserved),使用字符串匹配查看当前汉字所在词组与context是否相等,如果相等,该拼音为当前汉字的拼音。如果没有找到,使用使用attribute值最大拼音作为当前汉字的拼音。