- 締切済み
出力結果を一つのString型に集めたいのですが(つ_;)
以下のプログラムがあるのですが... import opennlp.tools.lang.english.TreebankParser; import opennlp.tools.parser.Parse; import opennlp.tools.parser.ParserME; import opennlp.tools.util.Span; public class Koubun { public static void main(String[] args) throws Exception { ParserME parser = TreebankParser.getParser("C:\\opennlp", true, false, ParserME.defaultBeamSize, ParserME.defaultAdvancePercentage); String input = "I am a student."; Parse[] parses = TreebankParser.parseLine(input, parser, 1); for (Parse parse : parses) { output(parse); } } private static void output(Parse parse) { if (parse.getChildCount() == 0) { Span span = parse.getSpan(); String word = parse.getText().substring( span.getStart(), span.getEnd()); System.out.print(word); } else { System.out.print("(" + parse.getType() + " "); for (Parse child : parse.getChildren()) { output(child); } System.out.print(")"); } } } このプログラムは英文を構文解析できるプログラムで"C:\\opennlp"の部分にhttp://opennlp.sourceforge.net/models/english/parser/でダウンロードできる build.bin.gz check.bin.gz chunk.bin.gz dict.bin.gz head_rules tag.bin.gz tagdict を置くことで構文解析できます. そこで質問があります(つ_;) 最終的に複数のSystem.out.printから画面上に (TOP (S (NP (PRP I))(VP (VBP am)(NP (DT a)(NN student.))))) と表示されるのですが,この表示を一つのStringの変数に入れることはできるでしょうか?? 最終的には String str = 出力結果 のように一つのstrに集めたいのです. 本当に困ってます.. 返答お待ちしております..m(_ _)m
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- ProKaseifu
- ベストアンサー率51% (98/192)
リンク先のサイト、会社からだとフィルターひっかかって見れないのでしばらく回答できそうにないです。 -classpath \c:\opennlp だけだとコンパイルできなかった・・・;_;
- ProKaseifu
- ベストアンサー率51% (98/192)
設定が結構面倒みたいなので簡単に設定方法教えてもらえませんか? とりあえずファイルはDLしました。 設定方法から調べていると仕事に影響でそうなので・・・
補足
手間をかけさせて本当に申し訳ありません. あのプログラムを動かすためには http://sourceforge.net/project/showfiles.php?group_id=3368 からOPENnlp toolsをダウンロードしてクラスパスに追加する必要があります. 詳しくはhttp://d.hatena.ne.jp/kaiseh/20080808/1218192566#cを見ていただければ分かりやすいです♪ また,このプログラムを実行するときにはヒープ領域が不足しているので、-Xmxオプションで増やす必要があります. ややこしくてすみません.何か不具合があればいつでも連絡ください..
- newta777
- ベストアンサー率58% (20/34)
たくさんStringを繋げるようなら StringBufferを使った方が良いですよ。 趣味で作っているだけならばStringでも良いですが。 メモリとパフォーマンスに影響します。
お礼
StringBuilderを使い一か所にまとめることができました☆ コメント本当にありがとうございます♪
- ProKaseifu
- ベストアンサー率51% (98/192)
てきとーにこんなの作ってみましたが、想定どおりに動くのですがねー・・・ class Sample { private static String tmp = ""; public static void main(String args[]){ sub(1); sub(2); sub(3); System.out.println(tmp); } private static void sub(int count){ tmp = tmp + count + ":aaa"; } } 結果 1:aaa2:aaa3:aaa 原因よくわからないので暇なときにファイルDLして動かしてみます。
- ProKaseifu
- ベストアンサー率51% (98/192)
public class Koubun { private static String str = ""; ・ (中略) ・ System.out.print(word); str = str + word; ・ (中略) ・ System.out.print("(" + parse.getType() + " "); str = str + "(" + parse.getType() + " "; ・ (中略) ・ System.out.print(")"); str = str + ")"; ってことですよね?(違うのかな・・・) こんだけプログラムかけてるんだからこの程度わからないはずないと思うのですが・・・(課題○投げじゃなければ)
補足
わかりやすい説明本当にありがとうございます♪ もう一つだけ質問させて下さい... import java.io.BufferedReader; import java.io.InputStreamReader; import opennlp.tools.lang.english.TreebankParser; import opennlp.tools.parser.Parse; import opennlp.tools.parser.ParserME; import opennlp.tools.util.Span; public class Kaaaaa2 { private static String rt = ""; public static void main(String[] args) throws Exception { ParserME parser = TreebankParser.getParser("C:\\opennlp", true, false,ParserME.defaultBeamSize,ParserME.defaultAdvancePercentage); for(int i=0; i<10; i++) { System.out.println(""); System.out.println("英文を入力して下さい"); BufferedReader ar = new BufferedReader(new InputStreamReader(System.in)); String input = ar.readLine(); input = input.replace(".", ""); input = input.replace("?", ""); Parse[] parses = TreebankParser.parseLine(input, parser, 1); for (Parse parse : parses) { output(parse); } } >>>>>System.out.println(rt); } private static void output(Parse parse) { if (parse.getChildCount() == 0) { Span span = parse.getSpan(); String word = parse.getText().substring(span.getStart(), span.getEnd()); //System.out.print(word); //ここでIとかgoとかを表示させているよ rt = rt + word; } else { //System.out.print("(" + parse.getType() + " "); rt= rt + "(" + parse.getType() + " "; for (Parse child : parse.getChildren()) { output(child); } //System.out.print(")"); rt = rt + ")"; } } } このように書き換えたのですが,mainでSystem.out.println(rt);を行ったところ,何も表示されません.. private内ではきちんと表示させることはできているのですが,privateからmainに送るにはどうしたらいいでしょうか???
- ProKaseifu
- ベストアンサー率51% (98/192)
private static void output(Parse parse) { if (parse.getChildCount() == 0) { Span span = parse.getSpan(); String word = parse.getText().substring( span.getStart(), span.getEnd()); >>>System.out.print(word); } else { >>>System.out.print("(" + parse.getType() + " "); for (Parse child : parse.getChildren()) { output(child); } >>>System.out.print(")"); } } } sysoutしているのはこの3箇所なので、String型のstatic変数を定義して、そこに値を追加していけばいいのでは?
補足
早い返答本当にありがとうございます(^^) すみません,私の力不足で理解がきちんとできません(つ_;) よろしければ,どう書いたらいいか補足していただけないでしょうか??
お礼
本当に親身に相談を聞いていただきありがとうございます. 以下のプログラムで実行したところ成功しました☆ public class Koubun2 { private static StringBuilder sb = new StringBuilder(""); public static void main(String[] args) throws Exception { ParserME parser = TreebankParser.getParser("C:\\opennlp", true, false, ParserME.defaultBeamSize, ParserME.defaultAdvancePercentage); for(int i=0; i<10; i++) { sb = new StringBuilder(""); System.out.println(""); System.out.println("英文を入力して下さい"); BufferedReader ar = new BufferedReader(new InputStreamReader(System.in)); String input = ar.readLine(); input = input.replace(".", ""); input = input.replace("?", ""); Parse[] parses = TreebankParser.parseLine(input, parser, 1); for (Parse parse : parses) { output(parse); } System.out.println(sb); } } private static void output(Parse parse) { if (parse.getChildCount() == 0) { Span span = parse.getSpan(); String word = parse.getText().substring( span.getStart(), span.getEnd()); sb.append(word); } else { sb.append("(" + parse.getType() + " "); for (Parse child : parse.getChildren()) { output(child); } sb.append(")"); } } } 本当にProKaseifuさんには感謝しています(つへ;) 多くのアドバイス本当にありがとうございました♪