.NET Core中文分词组件jieba.NET Core
特點
-
支持三種分詞模式:
-
精確模式,試圖將句子最精確地切開,適合文本分析;
-
全模式,把句子中所有的可以成詞的詞語都掃描出來,?速度非常快,但是不能解決歧義。具體來說,分詞過程不會借助于詞頻查找最大概率路徑,亦不會使用HMM;
-
搜索引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
-
-
支持繁體分詞
-
支持添加自定義詞典和自定義詞
jieba.NET Core 用法
下載代碼使用VS 2017 打開,或者使用VS Code 打開項目。
選擇jieba.NET 為起始項目,Program.cs 代碼如下:
????class?Program{????????static?void?Main(string[]?args){Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);????????????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));Console.ReadKey();}}運行程序結果如下:
?
JiebaSegmenter.Cut方法可通過cutAll來支持兩種模式,精確模式和全模式。精確模式是最基礎和自然的模式,試圖將句子最精確地切開,適合文本分析;而全模式,把句子中所有的可以成詞的詞語都掃描出來,?速度更快,但是不能解決歧義,因為它不會掃描最大概率路徑,也不會通過HMM去發現未登錄詞。
CutForSearch采用的是搜索引擎模式,在精確模式的基礎上對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
詞性標注
詞性標注采用和ictclas兼容的標記法,關于ictclas和jieba中使用的標記法列表,請參考:詞性標記。
在TestDemo.cs 中PosCutDemo 方法為詞性標注。
????????public?void?PosCutDemo(){????????????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))));}調用結果如下:
關鍵詞提取
現在來嘗試提取其中的關鍵詞。jieba.NET提供了TF-IDF和TextRank兩種算法來提取關鍵詞,TF-IDF對應的類是JiebaNet.Analyser.TfidfExtractor,TextRank的是JiebaNet.Analyser.TextRankExtractor。
????????public?void?ExtractTagsDemo(){????????????var?text?=????????????????"程序員(英文Programmer)是從事程序開發、維護的專業人員。一般將程序員分為程序設計人員和程序編碼人員,但兩者的界限并不非常清楚,特別是在中國。軟件從業人員分為初級程序員、高級程序員、系統分析員和項目經理四大類。";????????????var?extractor?=?new?TfidfExtractor();????????????var?keywords?=?extractor.ExtractTags(text);????????????foreach?(var?keyword?in?keywords){Console.WriteLine(keyword);}}????????public?void?ExtractTagsDemo2(){????????????var?text?=?@"在數學和計算機科學/算學之中,算法/算則法(Algorithm)為一個計算的具體步驟,常用于計算、數據處理和自動推理。精確而言,算法是一個表示為有限長列表的有效方法。算法應包含清晰定義的指令用于計算函數。算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和初始輸入(可能為空)開始,經過一系列有限而清晰定義的狀態最終產生輸出并停止于一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化算法在內的一些算法,包含了一些隨機輸入。形式化算法的概念部分源自嘗試解決希爾伯特提出的判定問題,并在其后嘗試定義有效計算性或者有效方法中成形。這些嘗試包括庫爾特·哥德爾、雅克·埃爾布朗和斯蒂芬·科爾·克萊尼分別于1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇于1936年提出的λ演算,1936年Emil?Leon?Post的Formulation?1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化算法的情況。";????????????var?extractor?=?new?TfidfExtractor();????????????var?keywords?=?extractor.ExtractTags(text,?10,?Constants.NounAndVerbPos);????????????foreach?(var?keyword?in?keywords){Console.WriteLine(keyword);}}ExtractTagsDemo 方法為提取所有關鍵詞。
?
ExtractTagsDemo2 方法為提取前十個僅包含名詞和動詞的關鍵詞
ExtractTagsWithWeight方法的返回結果中除了包含關鍵詞,還包含了相應的權重值。
返回詞語在原文的起止位置
????????public?void?TokenizeDemo(){????????????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);}}調用?TokenizeDemo 方法會返回對應位置
?
新詞加入
代碼加入
????????????var?segmenter?=?new?JiebaSegmenter();????????????var?segments?=?segmenter.Cut(@".NETCore2.0的發布時間,.NET?Core?2.0預覽版及.NET?Standard?2.0?Preview大概在5月中旬或下旬發布。");Console.WriteLine("【精確模式】:{0}",?string.Join("/?",?segments));segmenter.AddWord("發布時間");segmenter.AddWord(".NETCore2.0");segments?=?segmenter.Cut(@".NETCore2.0的發布時間,.NET?Core?2.0預覽版及.NET?Standard?2.0?Preview大概在5月中旬或下旬發布。");Console.WriteLine("【精確模式】:{0}",?string.Join("/?",?segments));調用?segmenter.AddWord添加新詞,這里添加了發布時間及.NETCore2.0
可以看到新加入的詞被識別出來。
詞典加入
詞典格式如下:詞典格式與主詞典格式相同,即一行包含:詞、詞頻(可省略)、詞性(可省略),用空格隔開。詞頻省略時,分詞器將使用自動計算出的詞頻保證該詞被分出。
創新辦?3?i 云計算?5凱特琳?nz 臺中 機器學習?3深度學習?8linezero?2然后使用segmenter.LoadUserDict() 方法,傳入詞典路徑。
本文轉自zsdnr ?51CTO博客,原文鏈接:http://blog.51cto.com/12942149/1949721,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的.NET Core中文分词组件jieba.NET Core的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux基础--Bash逻辑控制语句
- 下一篇: 用例设计方法