當前位置:成語大全網 - 成語詞典 - 拼音分詞算法 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;

}