.NET Core中文分片語件jieba.NET Core

來源:互聯網
上載者:User

標籤:搜尋引擎

特點
  • 支援三種分詞模式:

    • 精確模式,試圖將句子最精確地切開,適合文本分析;

    • 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義。具體來說,分詞過程不會藉助於詞頻尋找最大機率路徑,亦不會使用HMM;

    • 搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。

  • 支援繁體分詞

  • 支援添加自訂字典和自訂詞

jieba.NET Core 用法

下載代碼使用VS 2017 開啟,或者使用VS Code 開啟項目。

選擇jieba.NET 為起始項目,Program.cs 代碼如下:

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

    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();        }    }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

運行程式結果如下:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/443844/201704/443844-20170418194540274-274601975.png" style="margin:0px;padding:0px;border:0px;" />

 

JiebaSegmenter.Cut方法可通過cutAll來支援兩種模式,精確模式和全模式。精確模式是最基礎和自然的模式,試圖將句子最精確地切開,適合文本分析;而全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度更快,但是不能解決歧義,因為它不會掃描最大機率路徑,也不會通過HMM去發現未登入詞。

CutForSearch採用的是搜尋引擎模式,在精確模式的基礎上對長詞再次切分,提高召回率,適合用於搜尋引擎分詞

詞性標註

詞性標註採用和ictclas相容的標記法,關於ictclas和jieba中使用的標記法列表,請參考:詞性標記。

在TestDemo.cs 中PosCutDemo 方法為詞性標註。

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

        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))));        }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

調用結果如下:

650) this.width=650;" src="http://images2015.cnblogs.com/blog/443844/201704/443844-20170418194933446-889993404.png" style="margin:0px;padding:0px;border:0px;" />

關鍵詞提取

現在來嘗試提取其中的關鍵詞。jieba.NET提供了TF-IDF和TextRank兩種演算法來提取關鍵詞,TF-IDF對應的類是JiebaNet.Analyser.TfidfExtractor,TextRank的是JiebaNet.Analyser.TextRankExtractor

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

        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);            }        }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

ExtractTagsDemo 方法為提取所有關鍵詞。

650) this.width=650;" src="http://images2015.cnblogs.com/blog/443844/201704/443844-20170418195605352-470402075.png" style="margin:0px;padding:0px;border:0px;" />

 

ExtractTagsDemo2 方法為提取前十個僅包含名詞和動詞的關鍵詞

650) this.width=650;" src="http://images2015.cnblogs.com/blog/443844/201704/443844-20170418200346931-1517766175.png" style="margin:0px;padding:0px;border:0px;" />

ExtractTagsWithWeight方法的返回結果中除了包含關鍵詞,還包含了相應的權重值。

返回詞語在原文的起止位置

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

        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);            }        }

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

調用 TokenizeDemo 方法會返回對應位置

650) this.width=650;" src="http://images2015.cnblogs.com/blog/443844/201704/443844-20170418202612602-1933734487.png" style="margin:0px;padding:0px;border:0px;" />

 

新詞加入

代碼加入

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

            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));

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

調用 segmenter.AddWord添加新詞,這裡添加了發布時間及.NETCore2.0

650) this.width=650;" src="http://images2015.cnblogs.com/blog/443844/201704/443844-20170418201639134-923070241.png" style="margin:0px;padding:0px;border:0px;" />

可以看到新加入的詞被識別出來。

詞典加入

詞典格式如下:詞典格式與主詞典格式相同,即一行包含:詞、詞頻(可省略)、詞性(可省略),用空格隔開。詞頻省略時,分詞器將使用自動計算出的詞頻保證該詞被分出。

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

創新辦 3 i雲端運算 5凱特琳 nz台中機器學習 3深度學習 8linezero 2

650) this.width=650;" src="/img/fz.gif" alt="複製代碼" style="margin:0px;padding:0px;border:none;" />

然後使用segmenter.LoadUserDict() 方法,傳入詞典路徑。

更多詳細內容,可以查看代碼及readme.md


.NET Core中文分片語件jieba.NET Core

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.