拼音算法
⑴ 如何实现拼音与汉字的互相转换,拼音汉字转换器彝
基于词库的汉字转拼音
词库中既要包含每个字的拼音,也要包含常用单词/短语的读音。有些字是多音字,所以至少要保存其最常用的读音,不常用的读音多出现在单词短语里。
你好世界杯
我们的词库是这样子的:
你:nǐ
好:hǎo,hào
世:shì
界:jiè
杯:bēi
世界:shì,jiè
你好:nǐ,hǎo
苦尽甘来:kǔ,jìn,gān,lái
词库中最长的词苦尽甘来包含4个字。所以你好世界杯从4个字开始匹配:
判断你好世界是否在词库中,不在;
判断你好世是否在词库中,不在;
判断你好是否在词库中,在,得到nǐ,hǎo;
判断世界杯是否在词库中,不在;
判断世界是否在词库中,在,得到shì,jiè;
判断杯是否在词库中,在,得到bēi;
于是你好世界杯被转换为nǐ,hǎo,shì,jiè,bēi。
基于词库和分词工具的汉字转拼音
纯粹的基于词库的方法在实际的使用中会遇到问题,例如提出了解决方案这句话中了解会被当作一个单词,所以会得到错误的结果:
tí,chū,liǎo,jiě,jué,fāng,àn
更好的方法是先进行分词得到:
提出
了
解决
方案
然后基于词库对每个结果分别处理。
基于HMM的拼音转汉字
这里的拼音一般不带声调。
将汉字作为隐藏状态,拼音作为观测值,使用viterbi算法可以将多个拼音转换成合理的汉字。例如给出 ti,chu,le,jie,jue,fang,an ,viterbi算法会认为 提出了解决方案 是最合理的状态序列。
HMM需要三个分布,分别是:
初始时各个状态的概率分布
各个状态互相转换的概率分布
状态到观测值的概率分布
这个3个分布就是三个矩阵,根据一些文本库统计出来即可。
viterbi算法基于动态规划,
基于词库的拼音转汉字
原则:
词的权重大于字的权重;
转换中匹配的词越多,权重越小。
词库的格式是:
拼音:单词:权重
例如:
ni:你:0.15 ni:泥:0.12 a:啊:0.18 hao:好:0.14 nihao:你好:0.6
假如输入是 ni,hao,a ,我们计算一下各种组合的权重:
组合 权重
你,好,啊 0.15×0.14×0.18 = 0.00378
泥,好,啊 0.12×0.14×0.18 = 0.003024
你好,啊 0.6×0.18 = 0.108
可以看出, 你好,啊 是最好的结果。
实际实现中需要用到 动态规划 , 和求有向无环图中两点之间最短距离类似。
⑵ 求判断字符串是否是拼音的成熟算法
如果您是做输入法引擎的话,不能这么做的。任意的用户字母串都是拼音串。
例如:hello可以拆解为 he‘l’l‘o四段,您通过拼音输入法输入的话是可以完成输入的。
所以要做的话应该采用自动机原理,或者树结构来存储以任意字符开头的全部合法拼音组合。
例如 a开头的字符有 a、ai、ao、an、ang,那么以a开头的树的形状如下,+表示叶子结点,即若遇到此叶子节点则序列此时结束为合法序列。
a
i o n +
+ + + g
若给您一个字串是以a开头的,则从此树的根结点开始查找,例如序列为anaang
则起始查到an下一个字符为a所以已经无法再向下查找了,此时an即为一个拼音段,
接着下一个序列又是以a开头的所以继续在此树中查找,可以查到a此时a即为一个拼音段,
接下来重复这个过程,得到ang所以anaang的序列就被划分为了an'a'ang序列。
您只需要为26首字母建立树即可完成所有序列的匹配。
⑶ 拼音分词算法 C语言
#include <stdio.h>
#define M_JUZI 200
// 树图的链表验证结构
// 用图的链式存储来构造树,子树均记录串的静态位置(索引)
typedef struct ST_FenCi{
int LeiBie; // 连什么类别?1 : 韵母,2 : 声母
int SuoYin; // 声母后的韵母索引 或者 词语中韵母后一个字的声母索引
struct ST_FenCi *pN; // 兄弟
} FenCi;
typedef struct ST_Ci{
int SuoYin; // 在原始串内的子串(字)索引
int Chang; // 子串长度
} Ci; // 记录结果的结构
typedef struct ST_ShengMu {
char Pin[3]; // 声母字符串
FenCi *pLian; // 分词树的子树
} ShengMu; // 用来定义声母的静态集合
typedef struct ST_YunMu {
char Yin[5]; // 韵母字符串,区别于声母
FenCi *pLian; // 分词树的子树
} YunMu; // 用来定义韵母的静态集合
// 声母开字头
ShengMu smJiHe[29] = {{""},{"b"},{"c"},{"d"},{""},{"f"},{"g"},
{"h"},{""},{"j"},{"k"},{"l"},{"m"},{"n"},
{""},{"p"},{"q"},{"r"},{"s"},{"t"},{""},
{""},{"w"},{"x"},{"y"},{"z"},{"ch"},{"sh"},{"zh"}};
// 韵母收字尾
YunMu ymJiHe[24] = {{"a"},{"o"},{"e"},{"i"},{"u"},{"v"},
{"ai"},{"ei"},{"ui"},{"ao"},{"ou"},
{"iu"},{"ie"},{"ue"},
{"er"},
{"an"},{"en"},{"in"},{"un"},{"vn"},
{"ang"},{"eng"},{"ing"},{"ong"}};
// 关于分字树,完全可以按照“现代汉语词典”的音节表来构造
// 某分字子树的构造
void InitFenZiShu0() {
}
int main() {
char JuZi[M_JUZI];
//scanf("%s",JuZi);
// 算法1. 首字哈希查找,链表连字,链表连词
// 如果需要查找的表有限,可以用if ,else,也可以用哈希查找
// 待解决的问题:
// 1.1. 声母头与声母尾的混淆,两个字头之间至少相差三个位置
// 1.2. 韵母尾与声母头的混淆,上下文,回退
// 1.3. 超前搜索,首先,如果韵母可以扩展到更长的另一个韵母,
// 1.3.1 从韵母收字的时候,
// 不仅要尝试韵母的"扩展",而且要判断扩展后新韵母的后缀,
// 如果这个后缀为声母头,那么在声母头的后面是否有合适的韵母构成一个新字?
// 如果有,就需要记录这种可能,而且做好提前收尾的准备
// 如果没有,理所当然要把新的韵母继续"扩展"
// 这样的韵母比如:e->er, a->an->ang, e->en->eng, i->in->ing, u->un,
// 这样的声母比如:e, r, g
// 1.3.2 从声母找字的时候,
// 如果后面找不到声母头链表里所有的韵母,就可以扩展匹配更长的声母
// 算法2. 渐进地找到所有声母点,上下文分析,修正,分析到结构,显示
// 算法2.1 对原文的每个字,逐个匹配已知声母
// 算法2.2 已知声母,在一定范围里搜集在原文里出现的每个声母点
getchar(); // enter
return 1;
}
⑷ 算法是什么意思
算法_词语解释
【拼音】:suànfǎ
【解释】:1.算术的旧称。2.计算的方法。
【例句】:研究了系统体系结构、数据模型、数据远程访问、配号及配线算法。
⑸ 有谁能较详细的介绍下拼音输入法的算法实现。。
我介绍一种Java的简单GUI实现过程(主要组件是jlist)。
1.数据库:首先建立汉字与拼音字母字符串的对应数据字典,同音对应一组汉字数组。
2.数据结构:然后建立动态结构jlist存储要显示的拼音字符串,没有输入时不显示,输入字母后依次开始筛选,每次只显示可能的拼音(数据库已有的)。
3.汉字选取:选定拼音字符串后,从数据库读取对应汉字数组,jlist显示。选定,得到汉字。 不设联想输入。
选取过程jlist已经提供了方法。
⑹ 求一汉字拼音匹配算法
这可是大活
cxsj 可能是 程序设计,还可能是 持续时间