中文分詞演算法
⑴ n-gram中文分詞演算法怎麼算
主要看你的詞表結構了,最大詞長的初始值,查詞典的次數和匹配的次數,然後得出時間復雜度,原始hash演算法復雜度沒記錯的話應該是2.89,11年看過一個文獻,提出一種改進的演算法時間復雜度是2.291…… 另外,分詞演算法並不是原封不動的,比如有些搜索。
⑵ 請問什麼是自然語言處理中的中文分詞技術
眾所周知,英文是以詞為單位的,詞和詞之間是靠空格隔開,而中文是以字為單位,句子中所有的字連起來才能描述一個意思。例如,英文句子I am a student,用中文則為:「我是一個學生」。計算機可以很簡單通過空格知道student是一個單詞,但是不能很容易明白「學」、「生」兩個字合起來才表示一個詞。把中文的漢字序列切分成有意義的詞,就是中文分詞,有些人也稱為切詞。我是一個學生,分詞的結果是:我 是 一個 學生。
中文分詞技術屬於自然語言處理技術范疇,對於一句話,人可以通過自己的知識來明白哪些是詞,哪些不是詞,但如何讓計算機也能理解?其處理過程就是分詞演算法。
現有的分詞演算法可分為三大類:基於字元串匹配的分詞方法、基於理解的分詞方法和基於統計的分詞方法。
1、基於字元串匹配的分詞方法
這種方法又叫做機械分詞方法,它是按照一定的策略將待分析的漢字串與一個「充分大的」機器詞典中的詞條進行配,若在詞典中找到某個字元串,則匹配成功(識別出一個詞)。按照掃描方向的不同,串匹配分詞方法可以分為正向匹配和逆向匹配;按照不同長度優先匹配的情況,可以分為最大(最長)匹配和最小(最短)匹配;按照是否與詞性標注過程相結合,又可以分為單純分詞方法和分詞與標注相結合的一體化方法。常用的幾種機械分詞方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的詞數最小)。
還可以將上述各種方法相互組合,例如,可以將正向最大匹配方法和逆向最大匹配方法結合起來構成雙向匹配法。由於漢語單字成詞的特點,正向最小匹配和逆向最小匹配一般很少使用。一般說來,逆向匹配的切分精度略高於正向匹配,遇到的歧義現象也較少。統計結果表明,單純使用正向最大匹配的錯誤率為1/169,單純使用逆向最大匹配的錯誤率為1/245。但這種精度還遠遠不能滿足實際的需要。實際使用的分詞系統,都是把機械分詞作為一種初分手段,還需通過利用各種其它的語言信息來進一步提高切分的准確率。
一種方法是改進掃描方式,稱為特徵掃描或標志切分,優先在待分析字元串中識別和切分出一些帶有明顯特徵的詞,以這些詞作為斷點,可將原字元串分為較小的串再來進機械分詞,從而減少匹配的錯誤率。另一種方法是將分詞和詞類標注結合起來,利用豐富的詞類信息對分詞決策提供幫助,並且在標注過程中又反過來對分詞結果進行檢驗、調整,從而極大地提高切分的准確率。
對於機械分詞方法,可以建立一個一般的模型,在這方面有專業的學術論文,這里不做詳細論述。
2、基於理解的分詞方法
這種分詞方法是通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法信息和語義信息來處理歧義現象。它通常包括三個部分:分詞子系統、句法語義子系統、總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義信息來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和信息。由於漢語語言知識的籠統、復雜性,難以將各種語言信息組織成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段。
3、基於統計的分詞方法
從形式上看,詞是穩定的字的組合,因此在上下文中,相鄰的字同時出現的次數越多,就越有可能構成一個詞。因此字與字相鄰共現的頻率或概率能夠較好的反映成詞的可信度。可以對語料中相鄰共現的各個字的組合的頻度進行統計,計算它們的互現信息。定義兩個字的互現信息,計算兩個漢字X、Y的相鄰共現概率。互現信息體現了漢字之間結合關系的緊密程度。當緊密程度高於某一個閾值時,便可認為此字組可能構成了一個詞。這種方法只需對語料中的字組頻度進行統計,不需要切分詞典,因而又叫做無詞典分詞法或統計取詞方法。但這種方法也有一定的局限性,會經常抽出一些共現頻度高、但並不是詞的常用字組,例如「這一」、「之一」、「有的」、「我的」、「許多的」等,並且對常用詞的識別精度差,時空開銷大。實際應用的統計分詞系統都要使用一部基本的分詞詞典(常用詞詞典)進行串匹配分詞,同時使用統計方法識別一些新的詞,即將串頻統計和串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點。
到底哪種分詞演算法的准確度更高,目前並無定論。對於任何一個成熟的分詞系統來說,不可能單獨依靠某一種演算法來實現,都需要綜合不同的演算法。筆者了解,海量科技的分詞演算法就採用「復方分詞法」,所謂復方,相當於用中葯中的復方概念,即用不同的葯才綜合起來去醫治疾病,同樣,對於中文詞的識別,需要多種演算法來處理不同的問題。
⑶ java中文分詞演算法
這兩天正好在玩lucene,沒用庖丁分詞,主要是嫌它要配置環境,麻煩
下面是demo,記得要加lucene-core-2.3.2.jar和lucene-Analyzer.jar以及IKAnalyzer.jar這幾個包,有問題call我
import java.io.Reader;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.cn.ChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.mira.lucene.analysis.IK_CAnalyzer;
public class TestJeAnalyzer {
private static String testString1 = "冗長的代碼常常是復雜性的標志,會導致代碼難以測試和維護.";
public static void testStandard(String testString) throws Exception{
Analyzer analyzer = new StandardAnalyzer();
Reader r = new StringReader(testString);
StopFilter sf = (StopFilter) analyzer.tokenStream("", r);
System.err.println("=====standard analyzer====");
System.err.println("分析方法:默認沒有詞只有字");
Token t;
while ((t = sf.next()) != null) {
System.out.println(t.termText());
}
}
public static void testCJK(String testString) throws Exception{
Analyzer analyzer = new CJKAnalyzer();
Reader r = new StringReader(testString);
StopFilter sf = (StopFilter) analyzer.tokenStream("", r);
System.err.println("=====cjk analyzer====");
System.err.println("分析方法:交叉雙字分割");
Token t;
while ((t = sf.next()) != null) {
System.out.println(t.termText());
}
}
public static void testChiniese(String testString) throws Exception{
Analyzer analyzer = new ChineseAnalyzer();
Reader r = new StringReader(testString);
TokenFilter tf = (TokenFilter) analyzer.tokenStream("", r);
System.err.println("=====chinese analyzer====");
System.err.println("分析方法:基本等同StandardAnalyzer");
Token t;
while ((t = tf.next()) != null) {
System.out.println(t.termText());
}
}
public static void testJe(String testString) throws Exception{
// Analyzer analyzer = new MIK_CAnalyzer();
Analyzer analyzer = new IK_CAnalyzer();
Reader r = new StringReader(testString);
TokenStream ts = (TokenStream)analyzer.tokenStream("", r);
System.err.println("=====je analyzer====");
System.err.println("分析方法:字典分詞,正反雙向搜索,具體不明");
Token t;
while ((t = ts.next()) != null) {
System.out.println(t.termText());
}
}
public static void main(String[] args) throws Exception{
// String testString = testString1;
String testString = testString1;
System.out.println(testString);
testStandard(testString);
testCJK(testString);
// testPaoding(testString);
testChiniese(testString);
testJe(testString);
}
}
⑷ c語言中文分詞演算法
沒有掛網公布,需要咨詢專業人士。
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。
C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言。盡管C語言提供了許多低級處理的功能,但仍然保持著跨平台的特性,以一個標准規格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業平台的許多計算機平台上進行編譯。
C語言誕生於美國的貝爾實驗室,由丹尼斯·里奇(Dennis MacAlistair Ritchie)以肯·湯普森(Kenneth Lane Thompson)設計的B語言為基礎發展而來,在它的主體設計完成後,湯普遜和里奇用它完全重寫了UNIX,且隨著UNIX的發展,c語言也得到了不斷的完善。
為了利於C語言的全面推廣,許多專家學者和硬體廠商聯合組成了C語言標准委員會,並在之後的1989年,誕生了第一個完備的C標准,簡稱「C89」,也就是「ANSI C」,截至2020年,最新的C語言標准為2018年6月發布的「C18」。
⑸ 漢語分詞演算法如何實現
常用的分詞演算法有正向最大匹配、逆向最大匹配、雙向最大匹配、最佳匹配法、最少分詞法、詞網格演算法等等。
最大匹配法(Forward Maximum Matching method, FMM法):選取包含6-8個漢字的符號串作為最大符號串,把最大符號串與詞典中的單詞條目相匹配,如果不能匹配,就削掉一個漢字繼續匹配,直到在詞典中找到相應的單詞為止。匹配的方向是從右向左。
逆向最大匹配法(Backward Maximum Matching method, BMM法):匹配方向與MM法相反,是從左向右。實驗表明:對於漢語來說,逆向最大匹配法比最大匹配法更有效。
雙向匹配法(Bi-direction Matching method, BM法):比較MM法與RMM法的切分結果,從而決定正確的切分。
最佳匹配法(Optimum Matching method, OM法):將詞典中的單詞按它們在文本中的出現頻度的大小排列,高頻度的單詞排在前,頻度低的單詞排在後,從而提高匹配的速度。
⑹ 中文分詞演算法 英文怎麼說
Chinese Parsing algorithms
⑺ 中文分詞中正向最大匹配演算法的分詞速度是多少准確率大概為多少
主要看你的詞表結構了,最大詞長的初始值,查詞典的次數和匹配的次數,然後得出時間復雜度,原始hash演算法復雜度沒記錯的話應該是2.89,11年看過一個文獻,提出一種改進的演算法時間復雜度是2.291……
另外,分詞演算法並不是原封不動的,比如有些搜索引擎的詞表結構就採用tire樹結構,這樣不用設置最大詞長,不過內存空間方面就要有取捨,甚至還有採用減少查典次數增加匹配次數的搜索引擎……
所以單純的給你一個189.3m/M純內存分詞速度,但是這演算法換個台更高配置的伺服器卻變成了497.6ms/M,這沒有任何意義……
記得哪個文獻上有人說,分詞本身不是目的,而是後續處理過程的必要階段,所以,除非你是研究演算法的,否則單純追求這東西的速度和准確率沒什麼太大意義
⑻ 有哪些比較好的中文分詞方案
1. 好詞典很重要m不論什麼樣的分詞方法, 優秀的詞典必不可少, 越拿老掉牙的詞典對越新的文本進行分詞, 就越會分成一團糟. 怎樣構建一個優秀的詞典, 快速發現新新詞彙.。可以看有幾篇文章,講的非常透徹明白 : 互聯網時代的社會語言學:基於SNS的文本數據挖掘。
2. 演算法跟著需求走,建議根據不同的需求選用不同的演算法, 例如, 類似知乎頭部搜索的 AutoComplete 部分, 講究的是速度快, 興趣相關( 優先找和你賬戶相關, 和可能感興趣的內容 ), 分詞演算法反而在其次了. 而像全文搜索這樣大段大段的長文字.。我覺得則更注重的是精準, 應該選一個像CRF這樣的演算法。
⑼ 分詞演算法是什麼
分詞演算法是文本挖掘的基礎,通常對整個模型的效果起著較大的決定作用。
分詞演算法常用的兩種運行方式:
1、用戶搜索及匹配。
例如:我們在網路搜索一個詞 「手機回收」,那麼網路會先把這個詞分為手機和回收兩個詞這個時候呢網路會先在庫中搜索手機這個詞然後進行第一輪的篩選。把網頁當中沒有手機這個詞的去除,只保留帶有手機這個詞的結果,之後再從已篩選出來的網頁中,篩選出帶有回收這個詞的頁面。然後在所得結果裡面根據頁面評分給用戶進行排序。
2、網頁主題計算
前面啟蒙博客也講過,網路蜘蛛只是一個機器,並不能向人一樣去思考,而在處理文章的時候,網路蜘蛛則會把文章也進行分詞去處理,如過文章里 手機 這個詞出現頻率比較多,也就是所說的關鍵詞密度,那麼這個頁面也就會定性為手機方面的文章。
搜索引擎是通過分詞演算法來計算網頁的,如果我們能夠合理地利用分詞演算法進行網頁布局,會讓網頁將會有一個很好的得分。
中文分詞演算法大概分為三大類:
第一類是基於字元串匹配,即掃描字元串,如果發現字元串的子串和詞典中的詞相同,就算匹配,比如機械分詞方法。這類分詞通常會加入一些啟發式規則,比如「正向/反向最大匹配」,「長詞優先」等。
第二類是基於統計以及機器學習的分詞方法,它們基於人工標注的詞性和統計特徵,對中文進行建模,即根據觀測到的數據(標注好的語料)對模型參數進行訓練,在分詞階段再通過模型計算各種分詞出現的概率,將概率最大的分詞結果作為最終結果。
常見的序列標注模型有HMM和CRF。這類分詞演算法能很好處理歧義和未登錄詞問題,效果比前一類效果好,但是需要大量的人工標注數據,以及較慢的分詞速度。
第三類是通過讓計算機模擬人對句子的理解,達到識別詞的效果,由於漢語語義的復雜性,難以將各種語言信息組織成機器能夠識別的形式,目前這種分詞系統還處於試驗階段。
⑽ 誰能介紹下最新的中文分詞方法
理解法
統計法