1. 程式人生 > >jieba.NET是jieba中文分詞的.NET版本(C#實現)。

jieba.NET是jieba中文分詞的.NET版本(C#實現)。

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
    ),比如配置項為..\config(可通過..來調整相對路徑),若當前應用程式域的BaseDirectory是C:\myapp\bin\,那麼主詞典的路徑會拼接為:C:\myapp\config\dict.txt。

主要功能

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.TextRankExtractorTfidfExtractor相同的介面。需要注意的是,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