中文分詞程序?qū)嶒?yàn)報(bào)告_第1頁
中文分詞程序?qū)嶒?yàn)報(bào)告_第2頁
中文分詞程序?qū)嶒?yàn)報(bào)告_第3頁
中文分詞程序?qū)嶒?yàn)報(bào)告_第4頁
中文分詞程序?qū)嶒?yàn)報(bào)告_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上漢語分詞程序?qū)嶒?yàn)報(bào)告1、 程序功能描述: 本程序每次處理時(shí)都用緩沖區(qū)的數(shù)據(jù)從頭開始去存儲語料庫的鏈表中匹配一個最長的詞語來輸出,如若沒有匹配到的詞語則單獨(dú)輸出該首字。 為了簡化程序所以語料庫和預(yù)備分詞文章都統(tǒng)一采用ASCII碼的編碼方式,并且不允許文中出現(xiàn)英語單字節(jié)編碼。別且本程序沒有對未登錄詞和未聲明數(shù)據(jù)結(jié)構(gòu)格式進(jìn)行處理,都按照普通漢字進(jìn)行了分詞,因此在最后的性能比較中這部分的準(zhǔn)確率很差,但是在語料庫有存儲的部分中都是用最長匹配原則進(jìn)行了分詞,準(zhǔn)確率還是達(dá)到了很高的水平。 分詞符采用/+空格的方式來標(biāo)記分詞。 語料庫的名字默認(rèn)為:語料庫.txt,打開方式為只讀 讀取

2、的文件名字默認(rèn)為:resource.txt,打開方式為只讀 輸出的文件名字默認(rèn)為:result.txt,打開方式默認(rèn)為追加的方式2、 算法思路: (1)、從文件中讀取語料庫存儲在內(nèi)存中,組織成單鏈表的存儲方式 (2)、組織以首字的ASCII碼為下標(biāo)的哈希表指向語料庫鏈表 (3)、從文件中讀滿輸入緩沖區(qū),以緩沖區(qū)的首字的ASCII碼做為下標(biāo)從哈希表中查找首字相同的內(nèi)存地址。 (4)、從該地址開始逐條匹配,記錄其中匹配最長的詞語的長度和地址。寫入文件中并寫入分詞符。 (5)、讀滿緩沖區(qū),若文件已經(jīng)讀取完畢則查看緩沖區(qū)是否用盡,若已經(jīng)用完則執(zhí)行第(6)步,否則重復(fù)(4)過程。 (6)、釋放申請的內(nèi)存

3、空間,程序結(jié)束。3、 數(shù)據(jù)結(jié)構(gòu):typedef struct coredict/使用鏈表來存儲語料庫 char data9; struct coredict*nextPtr;CoreDict,*CoreDictPtr;CoreDictPtr tablePtr=NULL,tailPtr=NULL,newPtr;/指向語料庫鏈表的頭和尾CoreDictPtr Hash65536=NULL;/一個以匹配詞語的第一個字的ASCII碼為下標(biāo)的指向鏈表的哈希表int MatchLength=0;/在一個單詞匹配過程中用來記錄能夠匹配到的最長的詞語的長度CoreDictPtr MatchPtr=NULL;/

4、在一個單詞匹配過程中用來記錄能夠匹配到的最長的詞語在鏈表中的地址4、 函數(shù)功能:int IsEqual(char,char);/判斷兩個漢字是否相等 int LongMatch(char,char);/void read(char,FILE*);/將讀入緩沖區(qū)讀滿void setoff(char,int);/將已經(jīng)匹配好的詞語從緩沖區(qū)中刪除5、 性能對比分析:程序性能描述: 在語義的判別和歧義消除方法只是用最長匹配法來降低誤差,因此這部分的性能提升不是很明顯。本程序沒有對未登錄詞和未聲明數(shù)據(jù)結(jié)構(gòu)格式進(jìn)行處理,都按照普通漢字進(jìn)行了分詞,因此在最后的性能比較中這部分的準(zhǔn)確率比較差,但是在語料庫有存

5、儲的部分中都是用最長匹配原則進(jìn)行了分詞,準(zhǔn)確率還是達(dá)到了很高的水平。另外由于語料庫規(guī)模的限制以及為了程序簡化著想在普通詞匯的搭配,例如形容詞的組合方面還有一些低頻詞的分詞方面也有些不是很高效。現(xiàn)有成熟分詞程序的情況和大致性能: 經(jīng)過十幾年的研究,漢語自動分詞技術(shù)取得了令人矚目的成果,出現(xiàn)了一些實(shí)用的自動分詞系統(tǒng),如:北京航空航天大學(xué)的cDws分詞系統(tǒng)、清華大學(xué)的SEG分詞系統(tǒng)和sE(玎AG分詞系統(tǒng)等,這些系統(tǒng)在分詞的精確度(精度達(dá)到99以上)和分詞速度(速度達(dá)到千字,s)方面都具有相當(dāng)?shù)乃?。六、程序性能提高方向?1).要能識別一些常見的數(shù)據(jù)格式,例如年月日、電話號碼等。(2).可以跳過一些

6、亂碼,例如一串亂字符串,還有數(shù)字串等。(3).增加判別字符類型的函數(shù),用來判別英文字符、漢語字符、還有另外的字符(4).建立詞語之間關(guān)聯(lián)性的數(shù)據(jù)庫,可以從語義方面,甚至語用方面來從邏輯上增加分詞的準(zhǔn)確性,以達(dá)到消除歧義的目的。 要是程序能增加上述的功能準(zhǔn)確度應(yīng)該可以達(dá)到90%以上。七、源代碼:#include<stdio.h>typedef struct coredict char data9; struct coredict*nextPtr;CoreDict,*CoreDictPtr;CoreDictPtr tablePtr=NULL,tailPtr=NULL,newPtr;Co

7、reDictPtr Hash65536=NULL;int MatchLength=0;CoreDictPtr MatchPtr=NULL;int IsEqual(char,char);/判斷兩個漢字是否相等 int LongMatch(char,char);void read(char,FILE*);void setoff(char,int);main() int i; char temp9,ch3,pre3="" unsigned short*p; FILE *fPtr,*rePtr; printf("讀取語料庫中.n"); if( (fPtr=fop

8、en("語料庫.txt","r")=NULL )/語料庫 printf("temp.txt文件打開失敗n"); goto END; if(newPtr=(CoreDictPtr)malloc(sizeof(CoreDict) != NULL ) newPtr->nextPtr=NULL; fscanf(fPtr,"%s",newPtr->data); /printf("%sn",newPtr->data); tablePtr=newPtr; tailPtr=newPtr; pr

9、e0=newPtr->data0;pre1=newPtr->data1; p=(unsigned short*)pre; Hash*p=tailPtr; else printf("動態(tài)內(nèi)存申請失敗n"); tailPtr->nextPtr=NULL; while( !feof(fPtr) ) if(newPtr=(CoreDictPtr)malloc(sizeof(CoreDict) != NULL ) newPtr->nextPtr=NULL; fscanf(fPtr,"%s",newPtr->data); /printf

10、("%sn",newPtr->data); tailPtr->nextPtr=newPtr; tailPtr=newPtr; ch0=newPtr->data0;ch1=newPtr->data1; if( !IsEqual(ch,pre) )/當(dāng)該項(xiàng)的首字與前一個詞的首字不相同時(shí)建立一個新的映射 p=(unsigned short*)ch; Hash*p=tailPtr; pre0=ch0;pre1=ch1; else printf("動態(tài)內(nèi)存申請失敗n"); printf("文件散列讀取完畢n"); pri

11、ntf("正在進(jìn)行詞匯匹配和分詞.(若該result.txt存在則會追加在該文本之后)n"); fclose(fPtr); if( (fPtr=fopen("resource.txt","r")=NULL )/source.txt printf("source.txt文件打開失敗n"); goto END; if( (rePtr=fopen("result.txt","a+")=NULL )/result.txt printf("result.txt文件打開失敗n&

12、quot;); goto END; /printf("n輸入#表示結(jié)束查找n"); /scanf("%s",temp); temp0='0' read(temp,fPtr); /printf("temp= %sn",temp); while( temp0!=EOF && temp0!='0') p=(unsigned short*)temp; newPtr=Hash*p; MatchLength=0; MatchPtr=NULL; if(newPtr!=NULL) /printf(&qu

13、ot;與查找項(xiàng)首字相同的有:n"); /printf("%sn",newPtr->data); /printf("temp= %sn",temp); i=LongMatch(temp,newPtr->data); if(i > MatchLength) MatchLength=i; MatchPtr=newPtr; newPtr=newPtr->nextPtr; while( newPtr!=NULL && IsEqual(newPtr->data,temp) ) /printf("%sn

14、",newPtr->data); i=LongMatch(temp,newPtr->data); if(i > MatchLength) MatchLength=i; MatchPtr=newPtr; newPtr=newPtr->nextPtr; /else /printf("沒有與查找項(xiàng)首字相同的n"); if(MatchPtr=NULL) /printf("沒有匹配項(xiàng)n"); fprintf(rePtr,"%c%c/ ",temp0,temp1); setoff(temp,2); else /p

15、rintf("最長匹配項(xiàng)為:%s 匹配長度為:%d",MatchPtr->data,MatchLength); fprintf(rePtr,"%s/ ",MatchPtr->data); setoff(temp,MatchLength); /對輸入緩沖區(qū)進(jìn)行處理 /printf("n輸入#表示結(jié)束查找n"); /scanf("%s",temp); read(temp,fPtr); fclose(fPtr); fclose(rePtr); printf("釋放語料庫內(nèi)存.n"); wh

16、ile(tablePtr!=NULL) newPtr=tablePtr; tablePtr=tablePtr->nextPtr; free(newPtr); printf("釋放語料庫內(nèi)存成功n"); END: system("pause"); return 0;int IsEqual(char a,char b) int i,k=0; if(a0=b0 && a1=b1 && a0!='0' && a1!='0') return 1; else return 0;in

17、t LongMatch(char temp,char coredic) int i=0,length=0; for(i=0;coredici!='0'i+=2) if( IsEqual(&(tempi),&(coredici) ) length+=2; else break; if( coredici!='0' ) length=0; return length;void read(char temp,FILE* fPtr) char a,b; int i; for(i=0;i<8;i+=2) if( tempi='0' ) fscanf(fPtr,"%c",

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論