在 asp.net 用 Jieba 做中文斷詞

前言

在 asp.net 上跑 jieba 做中文斷詞

先安裝套件

  • 查詢 jieba.NET

簡易 sample code

  • 呼叫 chatgpt 生成簡易程式碼
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    using JiebaNet.Segmenter;
    // 初始化 Jieba
    var segmenter = new JiebaSegmenter();

    // 分詞範例
    string sentence = "我愛自然語言處理";

    // 默認為精確模式
    var segments = segmenter.Cut(sentence);
    Console.WriteLine("【精確模式】:{0}", string.Join("/ ", segments));
    // 全模式
    segments = segmenter.Cut(sentence, cutAll: true);
    Console.WriteLine("【全模式】:{0}", string.Join("/ ", segments));
    // 搜尋引擎模式
    segments = segmenter.CutForSearch(sentence);
    Console.WriteLine("【搜尋引擎模式】:{0}", string.Join("/ ", segments));
  • 快樂得執行看看

    出現錯誤
    1
    DirectoryNotFoundException: Could not find a part of the path 'D:\workspace\jieba-sample\jieba-sample\bin\Debug\net8.0\Resources\prob_trans.json'.
  • 看來C#的套件沒有包含必要檔案
  • 只好去 jieba.NET github 去下載,把 Resources 資料夾丟進去專案裡,預設路徑是 Resources

執行成功

  • 可以看到結果長這樣
    1
    2
    3
    【精確模式】:我/ 愛自然/ 語言/ 處理
    【全模式】:我/ 愛/ 自/ 然/ 語/ 言/ 處/ 理
    【搜尋引擎模式】:我/ 愛自然/ 語言/ 處理
  • 但總覺得斷字的效果很差啊
  • 李組長眉頭一皺發現事情並不單純
  • 原來字典檔根本沒有用到
  • 點一下 dict.txt 在屬性中把「複製到輸出目錄」改成「有更新時才複製」
  • 重跑一次
    1
    2
    3
    【精確模式】:我/ 愛/ 自然/ 語言/ 處理
    【全模式】:我/ 愛/ 自然/ 語/ 言/ 處/ 理
    【搜尋引擎模式】:我/ 愛/ 自然/ 語言/ 處理
  • 結果看起來正常多了

繁中字典

  • 官方有提供支援繁中的字典 dict.txt.big
  • 加上指定字典
    1
    2
    var segmenter = new JiebaSegmenter();
    segmenter.LoadUserDict("D:\\workspace\\jieba-sample\\jieba-sample\\Resources\\dict.txt.big");
  • 結果有把「自然語言」切出來了,更加準確
    1
    2
    3
    【精確模式】:我/ 愛/ 自然語言/ 處理
    【全模式】:我/ 愛/ 自然/ 自然語言/ 語言/ 處理
    【搜尋引擎模式】:我/ 愛/ 自然/ 語言/ 自然語言/ 處理

自訂字典

  • 把文字改成「我愛祈菈貝希毛絲」這樣有專有名詞的情況
  • 會發現全模式會把貝希毛絲都切開來
    1
    2
    3
    【精確模式】:我/ 愛/ 祈菈/ 貝希毛絲
    【全模式】:我/ 愛/ 祈菈/ 貝/ 希/ 毛/ 絲
    【搜尋引擎模式】:我/ 愛/ 祈菈/ 貝希毛絲
  • 在字典中加上 「貝希毛絲 76 n」,再執行一次
    1
    2
    3
    【精確模式】:我/ 愛/ 祈菈/ 貝希毛絲
    【全模式】:我/ 愛/ 祈菈/ 貝希毛絲
    【搜尋引擎模式】:我/ 愛/ 祈菈/ 貝希毛絲
  • 這樣專有名詞也會正常被當作一個單詞處理

參考

jieba.NET