LoginSignup
3

posted at

updated at

kuromojiを使ったJavaScriptだけの形態素解析

はじめに

形態素解析というと、Pythonを使ってmecabというのが鉄板でしょうかね。辞書はneologdで。
でもほかの環境でも形態素解析したい場面があり、今回はJavaScriptでやってみるお話です。使うライブラリはkuromojiのJavaScript版。

ちなみに、mecabもneologdもkuromojiも、更新が止まっています。mecabは、2013/02/18 MeCab 0.996 が最新、neologdは2020/08/20 v0.0.7が最新、kuromojiは2018/11/24が最終更新日です。(2022/5/28時点)
最新の単語に対応していない等の問題が出る可能性がありますので、ご使用の際にはちょっとご注意ください。

作ったもの

動くものを置いておきます。公式のデモとほぼ同じですが、自分で文章を作れるのがほしかった。

ソースはgithubに置いておきます。

1. 環境

README.mdを見るとNode.jsの手順が書いてありますが、私は素のHTMLとJavaScriptで、ブラウザで見たかったので、ちょっと特殊かも。

githubのページから、/build/kuromoji.js/dict/*を入手し、HTMLから相対パスで見れるところへ配置します。

2. HTML

HTML側は、kuromoji.jsを読むだけです。パスは適当に。

HTML側
<script type="text/javascript" src="./js/lib/kuromoji.js"></script>

3. JavaScript

上記のjsを読み込んだ後であれば、kuromoji.builder()が使えるので、こんな感じで使います。

JavaScript
$(function(){
    $("#btn_execute").click(function(){
        kuromoji.builder({ dicPath: "./js/lib/kuromoji-dict/" }).build(function (err, tokenizer) {
            // tokenizer is ready
            
            // 入力のテキストを取得
            let target_text = $("#input_text").val();
            console.log({target_text});

            // 形態素解析実行
            let path = tokenizer.tokenize(target_text);

            // 結果を描画
            let tbody = $("#tbl_result > tbody");
            tbody.empty();
            for(let i=0; i<path.length; i++){
                let word = path[i];
                let tr = $("<tr></tr>")
                    .append($("<td></td>").text(word["surface_form"]))
                    .append($("<td></td>").text(word["pos"]))
                    .append($("<td></td>").text(word["pos_detail_1"]))
                    .append($("<td></td>").text(word["pos_detail_2"]))
                    .append($("<td></td>").text(word["pos_detail_3"]))
                    .append($("<td></td>").text(word["conjugated_type"]))
                    .append($("<td></td>").text(word["conjugated_form"]))
                    .append($("<td></td>").text(word["basic_form"]))
                    .append($("<td></td>").text(word["reading"]))
                    .append($("<td></td>").text(word["pronunciation"]))
                ;
                tbody.append(tr);
            }
        });
    });
});

kuromoji.builder()で辞書フォルダのパスを指定して作り上げ、build()で実行する処理を書いてます。これだとボタンを押すたびにbuildしてるけど、一度buildしたものを流用するようにできそうだけど、ひとまず。

おわりに

特に引っかかることはなくさらっと実現できました。何かで使える場面がありそうなので、道具の1つとして覚えておこうと思います。
ちなみに、ローカルに置いたHTMLだと動きません。これはブラウザのセキュリティ対策のため。私はchromeの機能拡張でWeb Server for Chromeで確認し、herokuで動かしました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3