— ランラン (@THE_RANRAN) September 29, 2020
日本語係り受け解析の仕様は以下のリンクを参照してください。
テキスト解析:日本語係り受け解析(V2) – Yahoo!デベロッパーネットワーク
それからJSONを使うので、Json.NETを使います。Json.NETがあれば、C#でJSONを簡単に扱えます。以下のリンクからダウンロードできます。
Newtonsoft.Json.dll をダウンロードしてプロジェクトに追加します。
まず日本語係り受け解析を
1 2 3 4 5 6 7 8 |
{ "id": "1234-1", "jsonrpc" : "2.0", "method" : "jlp.daservice.parse", "params" : { "q" : "うちの庭には二羽鶏がいます" } } |
まず係り受け解析をしたい文章をJSONに変換するために以下のようなクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[JsonObject] public class Request { public Request(string str) { id = DateTime.Now.ToShortTimeString(); params1.q = str; } public string id = ""; public string jsonrpc = "2.0"; public string method = "jlp.daservice.parse"; [JsonProperty("params")] public Requestparams params1 = new Requestparams(); } [JsonObject] public class Requestparams { public string q = ""; } |
以下のようにすればオブジェクトからJSONに変換できます。
1 2 |
Request request = new Request(sentence); string jsonText = JsonConvert.SerializeObject(request); |
次に解析結果を受け取ったあとの処理を考えます。以下のような結果が返ってくるので、それを処理するクラスを考えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
{ "id":"1234-1", "jsonrpc":"2.0", "result":{ "chunks":[ { "head":1, "id":0, "tokens":[ ["うち","うち","うち","名詞","普通名詞","*","*"], ["の","の","の","助詞","接続助詞","*","*"] ] }, { "head":3, "id":1, "tokens":[ ["庭","にわ","庭","名詞","普通名詞","*","*"], ["に","に","に","助詞","格助詞","*","*"], ["は","は","は","助詞","副助詞","*","*"] ] }, { "head":3, "id":2, "tokens":[ ["二","に","二","名詞","数詞","*","*"], ["羽","わ","羽","接尾辞","名詞性名詞助数辞","*","*"], ["鶏","にわとり","鶏","名詞","普通名詞","*","*"], ["が","が","が","助詞","格助詞","*","*"] ] }, { "head":-1, "id":3, "tokens":[ ["い","い","いる","動詞","*","母音動詞","基本連用形"], ["ます","ます","ます","接尾辞","動詞性接尾辞","動詞性接尾辞ます型","基本形"] ] } ] } } |
これを処理するために以下のようなクラスを作成します。Chunkクラス内のGetText()メソッドは文節を取得するためのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
[JsonObject] public class Response { public Response() { } public string id = ""; public string jsonrpc = ""; public Result result = new Result(); } public class Result { public List<Chunk> chunks = new List<Chunk>(); } public class Chunk { public int head = 0; public int id = 0; public List<string[]> tokens = new List<string[]>(); public string GetText() { string str = ""; foreach(string[] vs in tokens) { str += vs[0]; } return str; } } |
以下は解析したい文を引数とし、Responseオブジェクトを返すメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public partial class Form1 : Form { public const string myYahooID = "アプリケーションIDは各自で取得してください"; Response PostRelationAnalysis(string sentence) { string url = String.Format("https://jlp.yahooapis.jp/DAService/V2/parse?appid={0}", myYahooID); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; Request request = new Request(sentence); string jsonText = JsonConvert.SerializeObject(request); var bytes = Encoding.UTF8.GetBytes(jsonText); req.ContentLength = bytes.Length; new MemoryStream(bytes).CopyTo(req.GetRequestStream()); WebResponse resp = req.GetResponse(); string resText = ""; using(StreamReader sr = new StreamReader(resp.GetResponseStream())) { resText = sr.ReadToEnd(); } return JsonConvert.DeserializeObject<Response>(resText); } } |
上のリッチテキストボックスに解析したい文を入力してボタンをおすと、係り受けの解析結果が表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); Response jsonObj = PostRelationAnalysis(richTextBox1.Text); List<Chunk> chunks = jsonObj.result.chunks; foreach(Chunk chunk in chunks) { string chunkString1 = chunk.GetText(); int head = chunk.head; // どこにかかっているのか? Chunk chunk1 = chunks.FirstOrDefault(x => x.id == head); if(chunk1 != null) { string chunkString2 = chunk1.GetText(); sb.Append(String.Format("{0}\n ⇒{1}\n", chunkString1, chunkString2)); } } richTextBox2.Text = sb.ToString(); } } |