:::

線上中文斷詞工具:Jieba-JS / Online Chinese Analyzer: Jieba-JS

image

現在最流行的中文斷詞工具結巴(jieba)原本是以Python開發,必須要有Python的環境才能運作。不過它也有很多不同程式語言的版本,其中最好用的就是不需要安裝、只要瀏覽器就能夠執行的JavaScript版本:Jieba-JS。我把Jeiba-JS專案fork了一份:jieba-js,並加入了可以讓其他程式碼直接引用的方法。這樣在任何網頁上都可以輕易實作斷詞功能了。


Jieba-JS原始碼 / Repository

image

我把原始碼都放在GitHub上:

有需要的人可以直接下載:

或著用下面的方法,直接引用函式庫來斷詞。

使用方法 / Usage

布丁的Jeiba-JS使用的時候需要引用require-jieba-js.js檔案:

然後使用以下函式來呼叫:

call_jieba_cut(_text, _callback);

範例程式碼來說:

<script src="https://pulipulichen.github.io/jieba-js/require-jieba-js.js"></script>

<script>
_text = "這個布丁是在無聊的世界中找尋樂趣的一種不能吃的食物,喜愛動漫畫、遊戲、程式,以及跟世間脫節的生活步調。";
call_jieba_cut(_text, function (_result) {
  console.log(_result);
});
</script>

最後會在瀏覽器的console呈現斷詞結果:

image

斷詞的結果是:

["這個", "布丁", "是", "在", "無聊", "的", "世界", "中", "找尋", "樂趣", "的", "一種", "不能", "吃", "的", "食物", ",", "喜愛", "動漫畫", "、", "遊戲", "、", "程式", ",", "以及", "跟", "世間", "脫節", "的", "生活", "步調", "。"]

自訂詞庫設定 / Cutom Dictionary

Jieba允許大家自訂詞庫,我也在Jieba-JS中擴充了這個功能。

dict_custom.js是自訂詞庫的範例檔案,內容如下:

_custom_dict = [
  ["漫畫", 99999999, "n"],
];


// 引用設定檔案,以下不用變更
if (typeof(define) === "function") {
    define(function (require) {
        return _custom_dict;
    });
}
else {
    module.exports = _custom_dict;
}

詞庫是由多個詞彙組成,每個詞彙設定有三個欄位:

  • 詞:例如「漫畫」
  • 斷詞權重:要設很大才能蓋過原本的斷詞權重,如「99999999」。
  • 詞性標記:例如名詞「n」。Jieba的詞性列表請看「词的分类」這篇的內容。

在Jieba-JS中要使用自訂詞庫的話,用法如下:

call_jieba_cut(_text, _custom_dict, _callback);

示範用法如下:

var _text = "這個布丁是在無聊的世界中找尋樂趣的一種不能吃的食物,喜愛動漫畫、遊戲、程式,以及跟世間脫節的生活步調。";
var _custom_dict = "https://github.com/pulipulichen/jieba-js/blob/master/scripts/data/dict_custom.js";
call_jieba_cut(_text, _custom_dict, function (_result) {
  console.log(_result);
});

載入自訂詞庫之後,斷詞結果會有些變化:

image

原本「動漫畫」被視為一個詞,現在被斷開成為「動」跟「漫畫」了。

Node.js版本 / Use Jieba-JS in Node.js

image

我們也可以在Node.js上執行Jieba-JS。做法請參考node.js這個檔案,內容如下,運作結果如上圖:

require('../scripts/main.js');

_text = "這個布丁是在無聊的世界中找尋樂趣的一種不能吃的食物,喜愛動漫畫、遊戲、程式,以及跟世間脫節的生活步調。";

dict1 = require('../scripts/data/dictionary.js');
dict2 = require('../scripts/data/dict_custom.js');

node_jieba_parsing([dict1, dict2], _text, function (_result) {
    console.log(_result.join(" "));
});

線上展示 / Online Demo

你可以直接使用上面的網頁直接斷詞,不用再安裝其他工具了。


結語 / In closing

我開始研究Jieba-JS的理由很簡單,因為我只是想找一個免安裝的斷詞工具而已。雖然CKIP有提供線上展示服務,但是那並不是一個JavaScript工具,不好客製化。而且CKIP的詞庫是以Big5為主,一些特殊的文字是沒辦法辨識的。

另一方面,現在中文斷詞最主流的Jieba雖然也很多程式語言,也大多提供線上展示的連結,像是原始Python版的 http://jiebademo.ap01.aws.af.cm/ 或 PHP版的 http://jieba-php.fukuball.com/ ,但是也因為是伺服器端的語言,使用上並沒有這麼便利。

找著找著,沒想到Jieba真的有不用安裝的JavaScript版本,我就這樣子做了一個真正免安裝的「線上展示斷詞工具」了。這個工具並不是在伺服器端運作,而是完全在使用者端的瀏覽器運作。雖然運作速度比較慢一點,但是這樣我就幾乎不需要擔心伺服器當機的問題,非常好用。

除了解決了線上展示的問題之外,Jieba-JS也解決了另一個問題:Node.js難以安裝結巴斷詞器的問題。Node.js在Windows中要使用Jieba的話,必須要先安裝Python,然後在作業系統上編譯Jieba所需要的檔案,最後才能使用Jieba斷詞。但是這個安裝過程非常地困難,時常遭遇問題,可以看NodeJieba Readme.me中的「NodeJieba 在 Windows 上面的一系列安装问题和斗争成功过程参考」。

不過現在有Jieba-JS這樣的JavaScript函式庫之後,就不需要再去煩惱NodeJieba編譯的問題,可以在Node.js中直接使用Jieba-JS來斷詞。

希望這個程式幫得上大家的忙,一起來做中文文本分析吧。

總共4 則留言, (我要發問)

  1. 範例用ie開好像不行耶 會一直停在處理中

    回覆刪除
  2. 您好,想請問大大一個問題,要如何實現詞性標註

    例如這樣(github上的文件說明)的結果

    var nodejieba = require("nodejieba");
    console.log(nodejieba.tag("红掌拨清波"));
    //[ { word: '红掌', tag: 'n' },
    // { word: '拨', tag: 'v' },
    // { word: '清波', tag: 'n' } ]

    辛苦大大的整理了

    回覆刪除
    回覆
    1. 你好,

      呃,我不是用nodejieba,用的是jieba-js,所以你那個github上的文件說明是不一樣的

      https://github.com/pulipulichen/jieba-js/blob/master/scripts/main.js
      請自行研究程式碼,關鍵可能是這一個?我也不太清楚

      刪除

留言工具: