Help us understand the problem. What is going on with this article?

Unityで形態素解析する方法

More than 3 years have passed since last update.

Unityで形態素解析する方法についてまとめようと思います

そもそも形態素解析とは?

形態素解析とは、文章を意味のある単語に区切り、辞書を利用して品詞や内容を判別することを意味します

1.Yahoo!APIを使う

Yahooが提供しているAPIに形態素解析をしてくれるものがあります

UnityからYahooにwwwでリクエストを送ることで、形態素解析結果を受け取ることが出来ます

ただし、受け取るファイルはxml形式、
24時間以内で1つのアプリケーションIDにつき50000件のリクエストが上限となっています

詳しくは公式ページを参照してください

コード例は以下の様になります

summary.cs
using UnityEngine;
using System.Collections;
using System.Xml;
public class summary : MonoBehaviour {

    public IEnumerator Start() {

        // リクエスト先は仮
        string url = "http://";
        WWW www = new WWW(url);
        //  wait until HTML Contents will come 
        yield return www;

        if(www.error != null){
            Debug.Log("Error!");
        }else{
            Debug.Log("Success");
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(www.text);

                // 目的のノードだけを取り出す
            XmlNodeList levelsList = xmlDoc.GetElementsByTagName("word_list");
            foreach(XmlNode levelInfo in levelsList){
                Debug.Log(levelInfo.Name.ToString());
                XmlNodeList levelcontent = levelInfo.ChildNodes;
                foreach(XmlNode levelsItens in levelcontent){
                    foreach(XmlNode word in levelsItens){
                    if(word.Name == "surface")
                    {
                            Debug.Log(word.InnerText.ToString());
                    }
                    }

                }
            }

                }

                }

        }

リクエストURLは自分が何を受け取りたいかを考えてオプションを決める必要があります

例:文章から名詞だけを取り出して、表示するリクエストURL
http://jlp.yahooapis.jp/MAService/V1/parse?appid=
<あなたのアプリケーションID>&results=ma&filter=9&response=surface
&sentence=<解析する文章>

渡す文章はWWW.EscapeURL(解析する文章)とエンコードした方が良いです

2.NMeCabを使う

NMeCabは、オープンソース形態素解析エンジンMeCabの解析処理部分を、.NETライブラリとして移植したものです。
オリジナル版MeCabと同じ辞書を使用し、同じ解析結果を得ることができます。
純粋なC#言語で作成されており、ラッパーではないため、インストールがシンプルで、高速性と安定性にも優れています。NMeCab - 形態素解析エンジンMeCabの.NET版

上記サイトから、最新版をダウンロードします(2014/11/13時点で0.06.4が最新)

01.png

ダウンロードしたフォルダから、dicフォルダとLibNMeCab.dllをUnityに持って行きます

画像のNcab.csというファイルは自分が作成したものです

NMeCabで形態素解析してみようのコードを元に動かしてみます

辞書ファイルの位置を自分で作ったフォルダ構成に応じて変える必要があります

コード例は以下の様になります

Ncab.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NMeCab;

public class Ncab : MonoBehaviour {

    // Use this for initialization
    void Start () {

        string sentence = "Unityで形態素解析";

            MeCabParam param = new MeCabParam();
        param.DicDir = @"Assets/NMeCab0.06.4/dic/ipadic";

            MeCabTagger t = MeCabTagger.Create(param);
            MeCabNode node = t.ParseToNode(sentence);
            while (node != null)
            {
                if (node.CharType > 0)
                {
                    Debug.Log(node.Surface + "\t" + node.Feature);
                }
                node = node.Next;
            }
            Debug.Log("");
        }

}

実行結果
02.png

注意
NMeCabをAndroidで使う方法(Unity)を現在探しています.
情報を持っていらっしゃる方、是非コメント欄にてご教示ください.

3.TinySegmenter.NETを使う

品詞等は判別出来ませんが、分かち書きするだけならこちらが便利です

分かち書きとは文章において語と語の区切りを付けることを意味します

例えば、「私はUnityが好きです」を分かち書きすると

私|は|Unity|が|好き|です と、なります

使い方:ここからTinySegmenter.csをダウンロードします

Assetsの中にPluginsフォルダを作って、その中にTinySegmenter.csを入れます

03.png

エラーが出るかと思いますが

Edit -> Project Settings -> Player -> Api Compatibility Levelを .NET2.0にすることで消えます

04.png
コード例は以下の様になります

Tiny.cs
using UnityEngine;
using System.Collections;

public class Tiny : MonoBehaviour {

    // Use this for initialization
    void Start () {
        string text = "私はUnityが好きです";

        //TinySegmenterオブジェクトを作成する
        TinySegmenterDotNet.TinySegmenter seg = new TinySegmenterDotNet.TinySegmenter();
        //分かち書きを行う
        string[] words = seg.Segment(text);
        //"|"で区切って表示する
        Debug.Log(string.Join("|", words));
    }


}

実行結果
05.png

以上がUnityだけで形態素解析する主な方法だと思われます

勿論、サーバー側のPHPやPythonの方で形態素解析して、それをUnityに送る方法もあるかと思います

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away