質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.46%

  • JavaScript

    21072questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    2431questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

kuromoji.jsで形態素解析を行いたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,534

iwanharts

score 24

前提・実現したいこと

Node.jsを使いServerを構築中。
kuromoji.jsを用いて形態素解析をしたい。
形態素解析は静的なものしか扱わない。

発生している問題・エラーメッセージ

試しに、これに従い、kuromoji.jsのデモを実行可能にした。
だが、以下のjsの意味がわからないので解説してほしい。
コメントアウトされている部分は大丈夫です。

該当のソースコード

/*
 * Copyright Copyright 2014 Takuya Asano
 * Copyright 2010-2014 Atilika Inc. and contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// require vue as MVVM framework
// require kuromoji

var DIC_URL = "bower_components/kuromoji/dist/dict/";

var tokenizer = null;
// var lattice;  // Very large object. Unwatch this object from Model.
// var renderer = new dagreD3.Renderer();


var vm = new Vue({
    el: "#demo",
    data: {
        inputText: "",
        tokens: [],
        isLoading: true,
        message: "Loading dictionaries ...",
        svgStyle: "hidden"
    },
    methods: {
        /*
        drawGraph: function () {
            if (lattice != null) {
                drawLattice();
                vm.svgStyle = "visible";
            }
        },
        */
        tokenize: function () {
            if (vm.inputText == "" || tokenizer == null) {
                vm.tokens = [];
                // lattice = null;
                return;
            }
            try {
                // lattice = tokenizer.getLattice(vm.inputText);
                vm.tokens = tokenizer.tokenize(vm.inputText);
            } catch (e) {
                console.log(e);
                // lattice = null;
                vm.tokens = [];
            }
        }
    }
});


// フォームの内容が変化したらtokenizeする
//vm.$watch("inputText", function (value) {
//    // vm.graphEnabled = false;
//    vm.svgStyle = "hidden";
//    vm.tokenize();
//});


// Load and prepare tokenizer
kuromoji.builder({ dicPath: DIC_URL }).build(function (error, _tokenizer) {
    if (error != null) {
        console.log(error);
    }
    tokenizer = _tokenizer;

    vm.message = "Ready";

    vm.inputText = "すもももももももものうち";
    vm.isLoading = false;
});


/*
function drawLattice () {
    // Create a new directed graph
    var g = new dagreD3.Digraph();

    // BOS
    var bos_node = lattice.nodes_end_at[0][0];
    g.addNode("0:BOS", { label: "BOS " + bos_node.cost });

    var i, j, k, nodes, node;

    // Draw node
    for (i = 1; i <= lattice.eos_pos; i++) {
        nodes = lattice.nodes_end_at[i];
        if (nodes == null) {
            continue;
        }
        for (j = 0; j < nodes.length; j++) {
            node = nodes[j];

            // Add nodes to the graph. The first argument is the node id. The second is
            // metadata about the node. In this case we're going to add labels to each of
            // our nodes.
            if (node.name == "EOS") {
                g.addNode(i + ":" + node.name, { label: node.name + " " + node.cost });
            } else {
                var features = tokenizer.token_info_dictionary.getFeatures(node.name);
                g.addNode(i + ":" + node.name, {
                    label: "<div>"  // + node.left_id + " " + node.name + " " + node.right_id + "<br />"
                        + features[0] + "<br />" + features[1] + "<br />" + features[2] + "<br />" + node.cost + "</div>"
                });
            }
        }
    }

    // Draw edge
    for (i = 1; i <= lattice.eos_pos; i++) {
        nodes = lattice.nodes_end_at[i];
        if (nodes == null) {
            continue;
        }
        for (j = 0; j < nodes.length; j++) {
            node = nodes[j];
            // var cost = Number.MAX_VALUE;
            // var shortest_prev_node;

            var prev_nodes = lattice.nodes_end_at[node.start_pos - 1];
            if (prev_nodes == null) {
                // TODO process unknown words
                continue;
            }
            for (k = 0; k < prev_nodes.length; k++) {
                var prev_node = prev_nodes[k];

                var edge_cost;
                if (node.left_id == null || prev_node.right_id == null) {
                    console.log("Left or right is null");
                    edge_cost = 0;
                } else {
                    edge_cost = tokenizer.viterbi_searcher.connection_costs.get(prev_node.right_id, node.left_id);
                }

                // Add edges to the graph. The first argument is the edge id. Here we use null
                // to indicate that an arbitrary edge id can be assigned automatically. The
                // second argument is the source of the edge. The third argument is the target
                // of the edge. The last argument is the edge metadata.
                g.addEdge(
                        (node.start_pos - 1) + ":" + prev_node.name + "-" + i + ":" + node.name,
                        (node.start_pos - 1) + ":" + prev_node.name,
                        i + ":" + node.name,
                    { label: String(edge_cost) });

                // TODO If best path, strong this edge
                // edge_metadata.style = "stroke: #f66; stroke-width: 3px;";
            }
        }
    }

    var layout = dagreD3.layout()
        .nodeSep(20)
        .edgeSep(20)
        .rankDir("LR");
    renderer.layout(layout).run(g, d3.select("svg g"));
}
*/

補足情報(言語/FW/ツール等のバージョンなど)

npm install kuromoji

でインストール。
また、上のファイルは/demo/kuromoji.js/demo/js配下にある。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

そのサンプルコードのコメント外の部分では

  1. 入力制御の定義
  2. 辞書の読み込み

を行っています。単純にkuromojiで形態素解析したい場合は、後者が終わったあと、tokenizer.tokenizeを実行してください。例:

kuromoji.builder({dicPath:'bower_components/kuromoji/dist/dict/'}).build(function(error,tokenizer){
  if(error){
    console.error(error.message)
  }
  else{
    console.log(tokenizer.tokenize('すもももももももものうち'))
  }
})

また、前者はVueに委任しているので、ここでは解説を割愛します。

DEMO

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaScript

    21072questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    2431questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。