解析結果をファイルに保存する方法を考えます。
ボタンをおすとファイルに保存されます。
解析結果を取得できたらこれをフィールド変数に保存します。
取得されたデータはこのようなものです。
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 |
<?xml version="1.0" encoding="UTF-8" ?> <ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:jp:jlp" xsi:schemaLocation="urn:yahoo:jp:jlp https://jlp.yahooapis.jp/MAService/V1/parseResponse.xsd"> <ma_result> <total_count>6</total_count> <filtered_count>6</filtered_count> <word_list> <word> <surface>今日</surface> <reading>きょう</reading> <pos>名詞</pos> <baseform>今日</baseform> <feature>名詞,名詞,*,今日,きょう,今日</feature> </word> <word> <surface>は</surface> <reading>は</reading> <pos>助詞</pos> <baseform>は</baseform> <feature>助詞,係助詞,*,は,は,は</feature> </word> <word> <surface>いい</surface> <reading>いい</reading> <pos>形容詞</pos> <baseform>いい</baseform> <feature>形容詞,形容,基本形,いい,いい,いい</feature> </word> <word> <surface>天気</surface> <reading>てんき</reading> <pos>名詞</pos> <baseform>天気</baseform> <feature>名詞,名詞,*,天気,てんき,天気</feature> </word> <word> <surface>です</surface> <reading>です</reading> <pos>助動詞</pos> <baseform>です</baseform> <feature>助動詞,助動詞です,基本形,です,です,です</feature> </word> <word> <surface>。</surface> <reading>。</reading> <pos>特殊</pos> <baseform>。</baseform> <feature>特殊,句点,*,。,。,。</feature> </word> </word_list> </ma_result> </ResultSet> |
word_listの中にwordというノードが並んでいます。XMLはこのような形で取得されるのでXmlDocumentクラスをつかって取得します。
まずLoadXmlメソッドでデータを読み込みます。ドキュメント全体からword要素を選択するには
1 2 3 |
var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlText); var nodes = xmlDoc.SelectNodes("//*[local-name()='word']"); |
あとはforeach文を使います。surfaceを取得するのであれば以下の方法で取得できます。
1 2 3 4 |
string str; XmlNode node1 = node.SelectSingleNode("*[local-name()='surface']"); if(node1 != null) // nullでないことを確認すること str = node1.InnerText; |
取得した文字列をカンマと改行でつなげてcsvファイルにします。
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 |
public partial class Form1 : Form { string maText = ""; void ShowMa(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", "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); maText = resText;// ここで保存する // DataGridViewに結果を表示させる DataSet ds = new DataSet("XML"); TextReader tr = new StringReader(resText); ds.ReadXml(tr); dataGridView1.DataSource = ds.Tables["word"]; } private void buttonSaveMa_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "csvファイル (*.csv)|*.csv"; dlg.DefaultExt = ".csv"; if (dlg.ShowDialog() == DialogResult.OK) { SaveCsvFile(maText, dlg.FileName); } } void SaveCsvFile(string xmlText, string filePath) { var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlText); var nodes = xmlDoc.SelectNodes("//*[local-name()='word']"); StringBuilder sb = new StringBuilder(); foreach (XmlNode node in nodes) { XmlNode node0 = node.SelectSingleNode("*[local-name()='count']"); XmlNode node1 = node.SelectSingleNode("*[local-name()='surface']"); XmlNode node2 = node.SelectSingleNode("*[local-name()='reading']"); XmlNode node3 = node.SelectSingleNode("*[local-name()='pos']"); XmlNode node4 = node.SelectSingleNode("*[local-name()='baseform']"); XmlNode node5 = node.SelectSingleNode("*[local-name()='feature']"); if (node0 != null) sb.Append(node0.InnerText + ","); if (node1 != null) sb.Append(node1.InnerText + ","); if (node2 != null) sb.Append(node2.InnerText + ","); if (node3 != null) sb.Append(node3.InnerText + ","); if (node4 != null) sb.Append(node4.InnerText + ","); if (node5 != null) sb.Append(node5.InnerText + ","); sb.Append("\r\n"); } StreamWriter sw = new StreamWriter(filePath, false, Encoding.Default); sw.Write(sb.ToString()); sw.Close(); } } |
こんにちは!
テキストを形態素解析した後に、単語ランキングを作り
それを元にナイーブベイズ分析するものを作りたいと思ってます!
教師あり学習というか、ユーザー側で「トラブル」「問合せ」「仕様」みたいにボタンを押して分類し、少しずつ学習させることができればと思ってます。
でも、そういった記事は難しくてよく分かりません…。
難しいので、自分で良くある単語リストを作るところは手でやろうと思います。
モデル作成と、モデルによるテキスト分類はプログラムでやりたいのですが
何かいい方法は無いでしょうか?
モデル作成について、あまり情報が無くて困ってます…。
これは難しい問題ですね。まあ考えてみます・・・。