今回はYahoo!デベロッパーネットワークの日本語形態素解析をつかってみます。日本語文を形態素に分割し、品詞、読みがなの付与、統計情報を取得することができます。
まずYahoo! JAPANのWebサービスを利用するには、アプリケーションIDが必要です。こちらから取得してください。
さて取得できたら・・・
まずはアプリの外観から。
左にあるのはテキストボックス、右にあるのはDataGridViewです。
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 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { Analysis(richTextBox1.Text); } string MakeUrl(string sentence) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse?"; url += "appid=" + myYahooID; url += "&sentence=" + sentence; return url; } void Analysis(string str) { WebClient Client = new WebClient(); Client.Encoding = Encoding.UTF8; // エンコードを cliant オブジェに設定する Client.Proxy = null; string url = MakeUrl(str); string s = Client.DownloadString(url); // url をセットして xml データを取得 richTextBox2.Text = s; DataSet ds = new DataSet("XML"); // dataset を作成 TextReader tr = new StringReader(s); // 取得した文字列をストリーム形式に ds.ReadXml(tr); // dataset に xml データとして取り込む dataGridView1.DataSource = ds.Tables["word"];// xml の "word" 以下を dataGridViewにセット } } |
実行するとこうなります。
もうちょっと拡張してみましょう。
リクエストURLはhttps://jlp.yahooapis.jp/MAService/V1/parse。ここにパラメーターをつけます。
https://jlp.yahooapis.jp/MAService/V1/parse?appid=<あなたのアプリケーションID>&results=ma&sentence=<解析したい文章>とやれば結果を得ることができます。これをDataGridViewに表示させます。
パラメーターはほかにも
results
“ma”: 形態素解析の結果を ma_result に返します。
“uniq”: 出現頻度情報を uniq_result に返します。
無指定の場合は “ma”。
response
surface, reading, pos, baseform, featureをコンマで区切って指定します。
無指定の場合は “surface,reading,pos”。
MakeUrlをちょっと変更。
1 2 3 4 5 6 7 8 9 10 11 12 |
public partial class Form1 : Form { string MakeUrl(string sentence) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse?"; url += "appid=" + myYahooID; url += "&sentence=" + sentence; url += "&results=" + "ma,uniq"; url += "&response=" + "surface,reading,pos,baseform,feature"; return url; } } |
これだと形態素解析だけでなく、使用されている単語の数もわかります。また助詞や助動詞のようなたいして意味のないものは取得したくない場合はフィルターを使います。
filter
解析結果として出力する品詞番号を “|” で区切って指定します。
1 : 形容詞
2 : 形容動詞
3 : 感動詞
4 : 副詞
5 : 連体詞
6 : 接続詞
7 : 接頭辞
8 : 接尾辞
9 : 名詞
10 : 動詞
11 : 助詞
12 : 助動詞
13 : 特殊(句読点、カッコ、記号など)
名詞と動詞と形容詞と形容動詞以外はいらないのであれば
1 |
https://jlp.yahooapis.jp/MAService/V1/parse?appid=<あなたのアプリケーションID>&results=ma&sentence=&<解析したい文章>&filter=1|2|9|10 |
とやればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public partial class Form1 : Form { string MakeUrl(string sentence) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse?"; url += "appid=" + myYahooID; url += "&sentence=" + sentence; url += "&results=" + "ma,uniq"; url += "&response=" + "surface,reading,pos,baseform,feature"; url += "&filter=" + "1|2|9|10"; return url; } } |
あと出現頻度情報を表示させるとき、uniq_by_baseformがtrueならば、基本形で結果を求めます。
実用性のありそうなものをつくる
もうちょっと実用性のありそうなものをつくってみます。
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { Analysis(textBox1.Text); } void Analysis(string str) { WebClient Client = new WebClient(); Client.Encoding = Encoding.UTF8; // エンコードを cliant オブジェに設定する Client.Proxy = null; if (checkBoxA.Checked) { string url = MakeUrlMa(str); string s = Client.DownloadString(url); // url をセットして xml データを取得 DataSet ds = new DataSet("XML"); // dataset を作成 TextReader tr = new StringReader(s); // 取得した文字列をストリーム形式に ds.ReadXml(tr); // dataset に xml データとして取り込む dataGridView1.DataSource = ds.Tables["word"];// xml の "word" 以下を dataGridViewにセット } if (checkBoxB.Checked) { string url = MakeUrlUniq(str); string s = Client.DownloadString(url); // url をセットして xml データを取得 DataSet ds = new DataSet("XML"); // dataset を作成 TextReader tr = new StringReader(s); // 取得した文字列をストリーム形式に ds.ReadXml(tr); // dataset に xml データとして取り込む dataGridView2.DataSource = ds.Tables["word"];// xml の "word" 以下を dataGridViewにセット } } string MakeUrlMa(string sentence) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse?"; url += "appid=" + myYahooID; url += "&sentence=" + sentence; url += "&results=" + "ma"; List<string> responses = new List<string>(); responses.Add("surface"); responses.Add("pos"); if (checkBoxReading.Checked) responses.Add("reading"); if (checkBoxBaseform.Checked) responses.Add("baseform"); url += "&response=" + String.Join(",", responses.ToArray()); List<string> filters = new List<string>(); if (checkBox1.Checked) filters.Add("1"); if (checkBox2.Checked) filters.Add("2"); if (checkBox3.Checked) filters.Add("3"); if (checkBox4.Checked) filters.Add("4"); if (checkBox5.Checked) filters.Add("5"); if (checkBox6.Checked) filters.Add("6"); if (checkBox7.Checked) filters.Add("7"); if (checkBox8.Checked) filters.Add("8"); if (checkBox9.Checked) filters.Add("9"); if (checkBox10.Checked) filters.Add("10"); if (checkBox11.Checked) filters.Add("11"); if (checkBox12.Checked) filters.Add("12"); if (checkBox13.Checked) filters.Add("13"); if (filters.Count > 0) { string s = String.Join("|", filters.ToArray()); url += "&filter=" + s; } return url; } string MakeUrlUniq(string sentence) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse?"; url += "appid=" + myYahooID; url += "&sentence=" + sentence; url += "&results=" + "uniq"; List<string> responses = new List<string>(); responses.Add("surface"); responses.Add("pos"); if (checkBoxBaseform.Checked) responses.Add("baseform"); url += "&response=" + String.Join(",", responses.ToArray()); List<string> filters = new List<string>(); if (checkBox1.Checked) filters.Add("1"); if (checkBox2.Checked) filters.Add("2"); if (checkBox3.Checked) filters.Add("3"); if (checkBox4.Checked) filters.Add("4"); if (checkBox5.Checked) filters.Add("5"); if (checkBox6.Checked) filters.Add("6"); if (checkBox7.Checked) filters.Add("7"); if (checkBox8.Checked) filters.Add("8"); if (checkBox9.Checked) filters.Add("9"); if (checkBox10.Checked) filters.Add("10"); if (checkBox11.Checked) filters.Add("11"); if (checkBox12.Checked) filters.Add("12"); if (checkBox13.Checked) filters.Add("13"); if (filters.Count > 0) { string s = String.Join("|", filters.ToArray()); url += "&filter=" + s; } if(checkBoxUniqByBaseform.Checked) url += "&uniq_by_baseform=true"; return url; } private void buttonAllClear_Click(object sender, EventArgs e) { checkBox1.Checked = false; checkBox2.Checked = false; checkBox3.Checked = false; checkBox4.Checked = false; checkBox5.Checked = false; checkBox6.Checked = false; checkBox7.Checked = false; checkBox8.Checked = false; checkBox9.Checked = false; checkBox10.Checked = false; checkBox11.Checked = false; checkBox12.Checked = false; checkBox13.Checked = false; } private void buttonAllCheck_Click(object sender, EventArgs e) { checkBox1.Checked = true; checkBox2.Checked = true; checkBox3.Checked = true; checkBox4.Checked = true; checkBox5.Checked = true; checkBox6.Checked = true; checkBox7.Checked = true; checkBox8.Checked = true; checkBox9.Checked = true; checkBox10.Checked = true; checkBox11.Checked = true; checkBox12.Checked = true; checkBox13.Checked = true; } } |
これは名詞と動詞と形容詞と形容動詞のみを解析対象にしています。