《自然語言處理導論》中文分詞程序實驗報告_第1頁
《自然語言處理導論》中文分詞程序實驗報告_第2頁
《自然語言處理導論》中文分詞程序實驗報告_第3頁
《自然語言處理導論》中文分詞程序實驗報告_第4頁
《自然語言處理導論》中文分詞程序實驗報告_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

自然語言處理導論中文分詞實驗報告一、 實驗目的了解中文分詞意義掌握中文分詞的基本方法二、 實驗環(huán)境Win7 64位DEV-C+編譯器三、 實驗設計(一)分詞策略目前較為成熟的中文分詞方法主要有:1、 詞典正向最大匹配法2、 詞典逆向最大匹配法3、 基于確定文法的分詞法4、 基于統(tǒng)計的分詞方法一般認為,詞典的逆向匹配法要優(yōu)于正向匹配法。基于確定文法和基于統(tǒng)計的方法作為自然語言處理的兩個流派,各有千秋。我設計的是根據詞典逆向最大匹配法,基本思路是:1、 將詞典的每個詞條讀入內存,最長是4字詞,最短是1字詞;2、 從語料中讀入一段(一行)文字,保存為字符串;3、 如果字符串長度大于4個中文字符,則取字符串最右邊的 4個中文字符,作為候選詞;否則取出整個字符串作為候選詞;4、 在詞典中查找這個候選詞,如果查找失敗,則去掉這個候選詞的最左字,重復這步進行查找,直到候選詞為1個中文字符;5、 將候選詞從字符串中取出、刪除,回到第3步直到字符串為空;6、 回到第2步直到語料已讀完。(二)程序設計查找算法: 哈希表漢字編碼格式:UTF-8程序流程圖:NOYESNONONONOYESYESYESYES匹配結束匹配結束匹配結束源代碼:#include #include #include #include #include #include #include #include #define MaxWordLength 12 / 最大詞長字節(jié)(即4個漢字) #define Separator / 詞界標記 #define UTF8_CN_LEN 3 / 漢字的UTF-8編碼為3字節(jié) using namespace std; using namespace _gnu_cxx; namespace _gnu_cxx template struct hash size_t operator()( const std:string& x ) const return hash()( x.c_str() ); ; hash_map wordhash; / 詞典 /讀入詞典void get_dict(void) string strtmp; /讀取詞典的每一行 string word; /保存每個詞 typedef pair sipair; ifstream infile(CoreDict.txt.utf8); if (!infile.is_open() cerr Unable to open input file: wordlexicon - bailing out! word; /讀入每行第一個詞 wordhash.insert(sipair(word, 1); /插入到哈希中 infile.close(); /刪除語料庫中已有的分詞空格,由本程序重新分詞 string del_space(string s1) int p1=0,p2=0; int count; string s2; while (p2 p1) s2 += s1.substr(p1,p2-p1); p2+; p1=p2; else p2+; s2 += s1.substr(p1,p2-p1); return s2; /用詞典做逆向最大匹配法分詞 string dict_segment(string s1) string s2 = ; /用s2存放分詞結果 while (!s1.empty() int len = (int) s1.length(); / 取輸入串長度 if (len MaxWordLength) / 如果輸入串長度大于最大詞長 len = MaxWordLength; / 只在最大詞長范圍內進行處理 string w = s1.substr(s1.length() - len, len); int n = (wordhash.find(w) != wordhash.end(); / 在詞典中查找相應的詞 while (len UTF8_CN_LEN & n = 0) / 如果不是詞 len -= UTF8_CN_LEN; / 從候選詞左邊減掉一個漢字,將剩下的部分作為候選詞 w = s1.substr(s1.length() - len, len); n = (wordhash.find(w) != wordhash.end(); w = w + Separator; s2 = w + s2; s1 = s1.substr(0, s1.length() - len); return s2; /中文分詞,先分出數字 string cn_segment(string s1) /先分出數字和字母 string s2; int p1,p2; p1 = p2 = 0; while (p2 s1.length() while ( p2 = (s1.length()-UTF8_CN_LEN) & ( s1.substr(p2,UTF8_CN_LEN).at(0)9 )/不是數字或字母 p2 += UTF8_CN_LEN; s2 += dict_segment(s1.substr(p1,p2-p1);/之前的句子用詞典分詞 /將數字和字母分出來 p1 = p2; p2 += 3; while ( p2 =0&s1.substr(p2,UTF8_CN_LEN).at(0)=9 )/是數字或字母 p2 += UTF8_CN_LEN; p1 = p2; /end while return s2; /在執(zhí)行中文分詞前,過濾半角空格以及其他非UTF-8字符 string seg_analysis(string s1) string s2; string s3 = ; int p1 = 0; int p2 = 0; int count; while ( p2 4)&14) 14)/過濾非utf-8字符 count = 0; do p2+; count+; while(s1p24)&14) 14) & p2 s1.length(); s2 = s1.substr(p1,p2-count-p1);/數字前的串 s3 += cn_segment(s2) + s1.substr(p2-count,count) + Separator;/數字 if (p2 = s1.length()/這個等號,當數字是最后一個字符時! s1 = s1.substr(p2,s1.length()-p2);/剩余串 p1 = p2 = 0; else p2 += UTF8_CN_LEN; if (p2 != 0) s3 += cn_segment(s1); return s3; ; int main(int argc, char* argv) ifstream infile(1998-01-qiefen-file.txt.utf8); / 打開輸入文件 if (!infile.is_open() / 打開輸入文件失敗則退出程序 cerr Unable to open input file: argv1 - bailing out! endl; system(pause); exit(-1); ofstream outfile1(result.txt.utf8); /確定輸出文件 if (!outfile1.is_open() cerr Unable to open file:SegmentResult.txt -bailing out! endl; system(pause); exit(-1); clock_t start, finish; double duration; start = clock(); get_dict(); finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout 詞典讀入完畢,耗時 duration s endl; string strtmp; /用于保存從語料庫中讀入的每一行 string line; /用于輸出每一行的結果 start = clock(); cout 正在分詞并輸出到文件,請稍候. endl; while (getline(infile, strtmp) /讀入語料庫中的每一行并用最大匹配法處理 line = del_space(strtmp); line = seg_analysis(line); / 調用分詞函數進行分詞處理 outfile1 line endl; / 將分詞結果寫入目標文件 finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout 分詞完畢,耗時 duration s endl; cout 分詞結果保存在result.txt.utf8中。 endl; system(pause); return 0; 結果和性能分析運行時間:可以看出,讀入詞典用時:0.421s;分詞用時:6.002s??赡苡绊懰俣鹊陌ú楸矸绞降牟煌?,以及存儲字的格式不同等等原因。分詞結果:在結果中,基本上大部分的分詞都算是成功的,

溫馨提示

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

評論

0/150

提交評論