ではGETリクエストをすることで日本語形態素解析をおこないました。
ところがこの方法では長い文章を解析することができません。1000文字を超える文字列で実験してみたところ、うまくいきませんでした。
によると、
HTTP1.1の仕様上はHTTP GETで転送できるデータ量(=URIの長さ)には上限がありません。Webサーバでデフォルトは制限されていますが、設定で変更することが可能です。
とのことです。上限はないけどWebサーバで制限されている場合がほとんどです。「設定で変更することが可能」といってもyahooのサーバーの設定をこちらで変更することはできません。
しかしGETがダメならPOSTがあるじゃないか!
ということでPOSTリクエストをやってみましょう。ただ「1リクエストの最大サイズは100KBに制限」されているので、これを超えることはできません。
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 |
void Analysis(string str) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse"; System.Net.WebClient wc = new System.Net.WebClient(); //NameValueCollectionの作成 var ps = new System.Collections.Specialized.NameValueCollection(); //送信するデータ(フィールド名と値の組み合わせ)を追加 ps.Add("appid", myYahooID); ps.Add("sentence", str); //データを送信し、また受信する byte[] resData = wc.UploadValues(url, ps); wc.Dispose(); //受信したデータを表示する string resText = System.Text.Encoding.UTF8.GetString(resData); DataSet ds = new DataSet("XML"); // dataset を作成 var tr = new System.IO.StringReader(resText); // 取得した文字列をストリーム形式に ds.ReadXml(tr); // dataset に xml データとして取り込む dataGridView1.DataSource = ds.Tables["word"];// xml の "word" 以下を dataGridViewにセット } |
この方法だと1000文字を超えても問題ありません。100KBという制限があるということは5万文字までできるということか?
それから拡張版では、Urlをつくる必要はないので
1 2 |
string MakeUrlMa(string sentence) string MakeUrlUniq(string sentence) |
は削除して以下のように作り替えました。
1 2 3 4 5 6 7 |
void Analysis(string str) { if (checkBoxA.Checked) ShowMa(str); if (checkBoxB.Checked) ShowUniq(str); } |
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 |
void ShowMa(string str) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse"; System.Net.WebClient wc = new System.Net.WebClient(); //NameValueCollectionの作成 var ps = new System.Collections.Specialized.NameValueCollection(); //送信するデータ(フィールド名と値の組み合わせ)を追加 ps.Add("appid", myYahooID); ps.Add("sentence", str); ps.Add("results", "ma"); if (GetResponses() != "") ps.Add("response", GetResponses()); if (Getfilters() != "") ps.Add("filter", Getfilters()); //データを送信し、また受信する byte[] resData = wc.UploadValues(url, ps); wc.Dispose(); //受信したデータを表示する string resText = System.Text.Encoding.UTF8.GetString(resData); DataSet ds = new DataSet("XML"); // dataset を作成 TextReader tr = new StringReader(resText); // 取得した文字列をストリーム形式に ds.ReadXml(tr); // dataset に xml データとして取り込む dataGridView1.DataSource = ds.Tables["word"];// xml の "word" 以下を 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 |
void ShowUniq(string str) { string url = "https://jlp.yahooapis.jp/MAService/V1/parse"; System.Net.WebClient wc = new System.Net.WebClient(); var ps = new System.Collections.Specialized.NameValueCollection(); ps.Add("appid", myYahooID); ps.Add("sentence", str); ps.Add("results", "uniq"); if(GetResponses() != "") ps.Add("response", GetResponses()); if (Getfilters() != "") ps.Add("filter", Getfilters()); if (checkBoxUniqByBaseform.Checked) ps.Add("uniq_by_baseform", "true"); byte[] resData = wc.UploadValues(url, ps); wc.Dispose(); string resText = System.Text.Encoding.UTF8.GetString(resData); DataSet ds = new DataSet("XML"); TextReader tr = new StringReader(resText); ds.ReadXml(tr); dataGridView2.DataSource = ds.Tables["word"]; } |
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 |
string Getfilters() { 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"); return String.Join("|", filters); } |
1 2 3 4 5 6 7 8 9 10 11 12 |
string GetResponses() { List<string> responses = new List<string>(); responses.Add("surface"); responses.Add("pos"); if (checkBoxReading.Checked) responses.Add("reading"); if (checkBoxBaseform.Checked) responses.Add("baseform"); return String.Join(",", responses); } |