Unityで形態素解析する方法についてまとめようと思います
#そもそも形態素解析とは?#
形態素解析とは、文章を意味のある単語に区切り、辞書を利用して品詞や内容を判別することを意味します
##1.Yahoo!APIを使う##
Yahooが提供しているAPIに形態素解析をしてくれるものがあります
UnityからYahooにwwwでリクエストを送ることで、形態素解析結果を受け取ることが出来ます
ただし、受け取るファイルはxml形式、
24時間以内で1つのアプリケーションIDにつき50000件のリクエストが上限となっています
詳しくは公式ページを参照してください
コード例は以下の様になります
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が最新)
ダウンロードしたフォルダから、dicフォルダとLibNMeCab.dllをUnityに持って行きます
画像のNcab.csというファイルは自分が作成したものです
NMeCabで形態素解析してみようのコードを元に動かしてみます
辞書ファイルの位置を自分で作ったフォルダ構成に応じて変える必要があります
コード例は以下の様になります
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("");
}
}
注意
NMeCabをAndroidで使う方法(Unity)を現在探しています.
情報を持っていらっしゃる方、是非コメント欄にてご教示ください.
##3.TinySegmenter.NETを使う##
品詞等は判別出来ませんが、分かち書きするだけならこちらが便利です
分かち書きとは文章において語と語の区切りを付けることを意味します
例えば、「私はUnityが好きです」を分かち書きすると
私|は|Unity|が|好き|です と、なります
使い方:ここからTinySegmenter.csをダウンロードします
Assetsの中にPluginsフォルダを作って、その中にTinySegmenter.csを入れます
エラーが出るかと思いますが
Edit -> Project Settings -> Player -> Api Compatibility Levelを .NET2.0にすることで消えます
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));
}
}
以上がUnityだけで形態素解析する主な方法だと思われます
勿論、サーバー側のPHPやPythonの方で形態素解析して、それをUnityに送る方法もあるかと思います