成语大全网 - 成语解释 - 拼音分词算法 C语言

拼音分词算法 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;

}