jieba.NET是jieba中文分詞的.NET版本(C#實現)。
阿新 • • 發佈:2019-02-08
jieba.NET是jieba中文分詞的.NET版本(C#實現)。
當前版本為0.38.2,基於jieba 0.38,提供與jieba一致的功能與介面,以後可能會在jieba基礎上提供其它擴充套件功能。關於jieba的實現思路,可以看看這篇wiki裡提到的資料。
如果您在開發中遇到與分詞有關的需求或困難,請提交一個Issue,I see u:)
特點
- 支援三種分詞模式:
- 精確模式,試圖將句子最精確地切開,適合文字分析;
- 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義。具體來說,分詞過程不會藉助於詞頻查詢最大概率路徑,亦不會使用HMM;
- 搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞
- 支援繁體分詞
- 支援新增自定義詞典和自定義詞
- MIT 授權協議
演算法
- 基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG)
- 採用了動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合
- 對於未登入詞,採用了基於漢字成詞能力的HMM模型,使用了Viterbi演算法
安裝和配置
當前版本基於.NET Framework 4.5,可以手動引用專案,也可以通過NuGet新增引用:
PM> Install-Package jieba.NET
安裝之後,在packages\jieba.NET目錄下可以看到Resources目錄,這裡面是jieba.NET執行所需的詞典及其它資料檔案,最簡單的配置方法是將整個Resources目錄拷貝到程式集所在目錄,這樣jieba.NET會使用內建的預設配置值。如果希望將這些檔案放在其它位置,則要在app.config或web.config中新增如下的配置項:
<appSettings> <add key="JiebaConfigFileDir" value="C:\jiebanet\config" /> </appSettings>
需要注意的是,這個路徑可以使用絕對路徑或相對路徑。如果使用相對路徑,那麼jieba.NET會假設該路徑是相對於當前應用程式域的BaseDirectory。
配置示例:
- 採用絕對路徑時,比如配置項為C:\jiebanet\config,那麼主詞典的路徑會拼接為:C:\jiebanet\config\dict.txt。
- 採用相對路徑時(或未新增任何配置項,那麼將會使用預設的相對路徑:Resources
主要功能
1. 分詞
JiebaSegmenter.Cut
方法接受三個輸入引數,text為待分詞的字串;cutAll指定是否採用全模式;hmm指定使用是否使用hmm模型切分未登入詞;返回型別為IEnumerable<string>
JiebaSegmenter.CutForSearch
方法接受兩個輸入引數,text為待分詞的字串;hmm指定使用是否使用hmm模型;返回型別為IEnumerable<string>
程式碼示例
var segmenter = new JiebaSegmenter(); var segments = segmenter.Cut("我來到北京清華大學", cutAll: true); Console.WriteLine("【全模式】:{0}", string.Join("/ ", segments)); segments = segmenter.Cut("我來到北京清華大學"); // 預設為精確模式 Console.WriteLine("【精確模式】:{0}", string.Join("/ ", segments)); segments = segmenter.Cut("他來到了網易杭研大廈"); // 預設為精確模式,同時也使用HMM模型 Console.WriteLine("【新詞識別】:{0}", string.Join("/ ", segments)); segments = segmenter.CutForSearch("小明碩士畢業於中國科學院計算所,後在日本京都大學深造"); // 搜尋引擎模式 Console.WriteLine("【搜尋引擎模式】:{0}", string.Join("/ ", segments)); segments = segmenter.Cut("結過婚的和尚未結過婚的"); Console.WriteLine("【歧義消除】:{0}", string.Join("/ ", segments));
輸出
【全模式】:我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學
【精確模式】:我/ 來到/ 北京/ 清華大學
【新詞識別】:他/ 來到/ 了/ 網易/ 杭研/ 大廈
【搜尋引擎模式】:小明/ 碩士/ 畢業/ 於/ 中國/ 科學/ 學院/ 科學院/ 中國科學院/ 計算/ 計算所/ ,/ 後/ 在/ 日本/ 京都/ 大學/ 日本京都大學/ 深造
【歧義消除】:結過婚/ 的/ 和/ 尚未/ 結過婚/ 的
2. 新增自定義詞典
載入詞典
- 開發者可以指定自定義的詞典,以便包含jieba詞庫裡沒有的詞。雖然jieba有新詞識別能力,但是自行新增新詞可以保證更高的正確率
JiebaSegmenter.LoadUserDict("user_dict_file_path")
- 詞典格式與主詞典格式相同,即一行包含:詞、詞頻(可省略)、詞性(可省略),用空格隔開
- 詞頻省略時,分詞器將使用自動計算出的詞頻保證該詞被分出
如
創新辦 3 i
雲端計算 5
凱特琳 nz
臺中
機器學習 3
調整詞典
- 使用
JiebaSegmenter.AddWord(word, freq=0, tag=null)
可新增一個新詞,或調整已知詞的詞頻;若freq
不是正整數,則使用自動計算出的詞頻,計算出的詞頻可保證該詞被分出來 - 使用
JiebaSegmenter.DeleteWord(word)
可移除一個詞,使其不能被分出來
3. 關鍵詞提取
基於TF-IDF演算法的關鍵詞提取
JiebaNet.Analyser.TfidfExtractor.ExtractTags(string text, int count = 20, IEnumerable<string> allowPos = null)
可從指定文字中抽取出關鍵詞。JiebaNet.Analyser.TfidfExtractor.ExtractTagsWithWeight(string text, int count = 20, IEnumerable<string> allowPos = null)
可從指定文字中抽取關鍵詞的同時得到其權重。- 關鍵詞抽取基於逆向檔案頻率(IDF),元件內建一個IDF語料庫,可以配置為其它自定義的語料庫。
- 關鍵詞抽取會過濾停用詞(Stop Words),元件內建一個停用詞語料庫,這個語料庫合併了NLTK的英文停用詞和哈工大的中文停用詞。
基於TextRank演算法的關鍵詞抽取
JiebaNet.Analyser.TextRankExtractor
與TfidfExtractor
相同的介面。需要注意的是,TextRankExtractor
預設情況下只提取名詞和動詞。- 以固定視窗大小(預設為5,通過Span屬性調整)和詞之間的共現關係構建圖
4. 詞性標註
JiebaNet.Segmenter.PosSeg.PosSegmenter
類可以在分詞的同時,為每個詞新增詞性標註。- 詞性標註採用和ictclas相容的標記法,關於ictclas和jieba中使用的標記法列表,請參考:詞性標記。
var posSeg = new PosSegmenter(); var s = "一團碩大無朋的高能離子云,在遙遠而神祕的太空中迅疾地飄移"; var tokens = posSeg.Cut(s); Console.WriteLine(string.Join(" ", tokens.Select(token => string.Format("{0}/{1}", token.Word, token.Flag))));
一團/m 碩大無朋/i 的/uj 高能/n 離子/n 雲/ns ,/x 在/p 遙遠/a 而/c 神祕/a 的/uj 太空/n 中/f 迅疾/z 地/uv 飄移/v
5. Tokenize:返回詞語在原文的起止位置
- 預設模式
var segmenter = new JiebaSegmenter(); var s = "永和服裝飾品有限公司"; var tokens = segmenter.Tokenize(s); foreach (var token in tokens) { Console.WriteLine("word {0,-12} start: {1,-3} end: {2,-3}", token.Word, token.StartIndex, token.EndIndex); }
word 永和 start: 0 end: 2
word 服裝 start: 2 end: 4
word 飾品 start: 4 end: 6
word 有限公司 start: 6 end: 10
- 搜尋模式
var segmenter = new JiebaSegmenter(); var s = "永和服裝飾品有限公司"; var tokens = segmenter.Tokenize(s, TokenizerMode.Search); foreach (var token in tokens) { Console.WriteLine("word {0,-12} start: {1,-3} end: {2,-3}", token.Word, token.StartIndex, token.EndIndex); }
word 永和 start: 0 end: 2
word 服裝 start: 2 end: 4
word 飾品 start: 4 end: 6
word 有限 start: 6 end: 8
word 公司 start: 8 end: 10
word 有限公司 start: 6 end: 10
6. 並行分詞(暫未實現)
7. 與Lucene.NET的整合
jiebaForLuceneNet專案提供了與Lucene.NET的簡單整合,更多資訊請看:jiebaForLuceneNet
8. 其它詞典
jieba分詞亦提供了其它的詞典檔案:
9. 分詞速度
- 全模式:2.5 MB/s
- 精確模式:1.1 MB/s
- 測試環境: Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz;圍城.txt(734KB)
10. 命令列分詞
Segmenter.Cli專案build之後得到jiebanet.ext,它的選項和例項用法如下:
-f --file the file name, (必要的). -d --delimiter the delimiter between tokens, default: / . -a --cut-all use cut_all mode. -n --no-hmm don't use HMM. -p --pos enable POS tagging. -v --version show version info. -h --help show help details. sample usages: $ jiebanet -f input.txt > output.txt $ jiebanet -d | -f input.txt > output.txt $ jiebanet -p -f input.txt > output.txt
https://github.com/anderscui/jieba.NET