java分词取词_中文自动分词技术
1、什么是自動分詞技術
在搜索中,我們常把搜索項作為一個句子提取出來當做特征項,如果提取出來的是英文,那么單詞和單詞之間用空格將句子拆分。而在中文文本中,詞與詞之間沒有天然的分隔符,中文詞匯大多是由兩個或兩個以上的漢字組成的,并且語句是連續書寫的。這就要求在對中文文本進行自動分析前,先將整句切割成小的詞匯單元,即中文分詞。用具體的例子來說明,就是如何把“我的爸爸是李剛”這樣連續書寫的語句切分為“我”、“的”、“爸爸”、“是”、“李剛”這五個詞匯單元。
2、自動分詞技術的重要性
對索引網頁庫信息進行預處理包括網頁分析和建立倒排文件索引兩個部分。文檔由被稱作特征相的索引詞(詞或者字)組成,網頁分析是將一個文檔表示為特征項的過程。中文自動分詞則是建立網頁分析的前提。在檢索和文檔分類系統中,自動分詞系統的速度直接影響整個系統的效率。
3、中文自動分詞常用算法
現在自動分詞算法分為三類:基于詞典的機械匹配的分詞方法、基于理解的分詞方法和基于統計的分詞方法。
4、算法介紹:自動分詞的基本方法有:基于字符串匹配的分詞方法和基于統計的分詞方法。
1)??????? 基于字符串匹配的分詞方法
這種方法又稱為機械分詞方法,它是按照一定的策略將待分析的漢字串與一個充分大的詞典中的詞條進行匹配,若在詞典中找到某個字符串,則匹配成功(識別出一個詞)。
按照掃描方向的不同,串匹配分詞方法可以分為正向匹配和逆向匹配;按照不同長度優先匹配的情況,可以分為最大或最長和最小或最短匹配;按照是否與詞性標注過程相結合,又可以分為單純分詞方法和分詞與標注相結合的一體化方法。常用的幾種機械分詞方法如下:
l? 正向最大匹配
l? 逆向最大匹配
l? 最少切分
還可以將上述各種方法相互結合,例如,可以將正向最大匹配方法和逆向最大匹配方法相結合起來構成雙向匹配法。由于漢字單詞成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高于正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率為1/169,單純使用逆向最大匹配的錯誤率為1/245。
對于機械分詞方法,可以建立一個一般的模型,形式地為ASM(d,a,m),即Automatic Segmentation Model。其中,d:匹配方向,+表示正向,-表示逆向;a:每次匹配失敗增加或減少字串長度,+為增字,-為減字;m:最大或最小匹配標志,+為最大匹配,-為最小匹配。
例如,ASM(+,-,+)就是正向減字最大匹配法,ASM(-,-,+)就是逆向減字最大匹配法。
2)??????? 基于統計的分詞方法
從形式上看,詞是穩定的字的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。因此與字相鄰共現得頻率或概率能夠較好的反映成詞的可行度。可以對預料中相鄰共現的各個字的組合的頻率進行統計,計算它們的互現信息。計算漢字X和Y的互現信息公式為M(X,Y)=lg(P(X,Y)/P(X)P(Y))其中,P(X,Y)是漢字X,Y的相鄰共現概率,P(X)、P(Y)分別是X,Y在語料中出現的頻率。互現信息體現了漢字之間結合的關系的緊密程度。當緊密程度高于某一個閾值時,便可認為此字組可能構成了一個詞。這種方法只需對語料中的字組頻度進行統計,不需要切分詞典,因而又叫做無詞典分詞法或統計取詞方法。但這種方法也有一定的局限性,會經常抽出一些共現頻度高、但并不是詞的常用詞組,例如,“這一”、“之一”、“有的”、“我的”、“許多的”等,并且對常用詞的識別精度差,時空開銷大。實際應用的統計分詞系統都要使用一部基本的分詞詞典進行串匹配分詞,同時使用統計方法識別一些新的詞,即將串頻統計和串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,有利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。
5、正向減字最大匹配法
正向減字最大匹配法切分的過程是從自然語言的中文語句中提取出設定的長度字串,與詞典比較,如果在詞典中,就算一個有意義的詞串,并用分隔符分割輸出,否則縮短字串,再詞典中重新查找。
算法要求為:
輸入:中文詞典,待切分的文本d,d中有若干被標點符號分割的句子s1,設定的最大詞長Maxlen。
輸出:每個句子s1被切成若干長度不超過Maxlen的字符串,并用分隔符分開,記為s2,所有s2的連接構成d切分之后的文本。
該算法的思想是:事先將網頁預處理成每行是一個句子的純文本格式。從d中逐句提取,對于每個句子s1從左向右以Maxlen為界選出候選字串W,如果W在詞典中,處理下一個長為Maxlen的候選字段;否則,將W最右邊一個字去掉,繼續與詞典比較;s1切分完之后,構成詞的字符串或者此時W已經為單字,用分割符隔開輸出給s2。從s1中減去W,繼續處理后續的字串。S1處理結束,取T中的下一個句子賦給s1,重復前述步驟,直到整篇文本d都切分完畢。
考慮到詞典的條目較多,而且每切一個詞都要比較,采用STL中的map容器作為存儲詞典的數據結構。Map容器采用的數據結構是“紅黑樹”。“紅黑樹”是一種較常用的查找效率較高的平衡二叉搜索樹。在實際應用中可以采用hash表數據結構存儲獲得更快速的查找。
算法的主程序流程如下圖1所示,分詞程序如圖2所示。其中Maxlen是一個經驗值,通常設為8個字節,Maxlen過小,長詞會被切斷;過長,又會導致切分效率低。
圖1
6、算法分析結論
中文自動分詞的實現為Web文檔挖掘研究以及中文信息處理提供了可能,使得人們能夠在這個基礎上進行更加深入的研究。本文利用visual C++開發工具實現了中文自動分詞算法,通過實驗可知在算法中逆向匹配算法精度要求高,速度要快。
代碼
Void SegmentAFile(T) //對文件進行分詞處理的函數
1 While(getASentenceFromFile(T,s1)) //循環讀入文件中的每一行
2 s2=CutWord(s1) //調用句子分詞處理函數
3 OutputSetence(s2) //將分詞結果寫入目標文件
String CutWord(s1)
4 Preprocess(s1) //跳過非漢字部分字符串
5 While(s1!=””) //如果輸入不為空
6 W=s1.sustr(0,Maxlen) //取等于最大詞長的候選詞
7 While(length(w)>1)
8 If(FindInRBTree(W)=false)//如果不是詞并且不是單字
9 Then W=W-1 //將W最右邊一個字去掉
10 s2=W+”/” //將找到的詞用分隔符分開
11 s1=s1-W //去掉找到的詞,繼續分析
12 Return s2
7、算法分析
設文本文件含有句子的數目為m,句子的平均長度為k,詞典的條目為n。實際中m和k遠遠小于n,整個算法復雜度中起決定作用的步驟在于n相關的語句。
行1,O(m)? 行2,O(klg n)? 行3,O(1)? 行4,O(1)
行5,O(k)? 行6,O(1)? 行7,O(1)? 行8,O(lg n)
行9,O(1)? 行10,O(1) 行11,O(1) 行12, O(1)
整個算法的時間復雜度為O(mk lg n)。
總結
以上是生活随笔為你收集整理的java分词取词_中文自动分词技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大海航行靠舵手,FONE将把财务数字化的
- 下一篇: UTL_FILE详解