質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3465閲覧

Javaでそれぞれの英単語のTFIDFの求め方がわかりません。

manchester

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/12/18 15:06

編集2016/12/18 17:53

Javaを独学で勉強中のJava初心者です。Javaで英文テキストファイルを読み込みそれぞれの英単語のTFIDFを表示させるプログラムを作りたいのですが、どうしてもうまくできません。TFのみを作ってみました。
エラーの意味がわかりません。
ファイルの読み込み方がわからないので直接英文を打ち込みました。こちらでは長いので省略しました。
降順表示もしたいです。

import

1import java.util.List; 2import java.lang.String; 3/** 4 * doc 文書 5 term 用語 6 */ 7public class TF1 { 8 public double tf(List<String> doc, String term) { 9 double result = 0; 10 for (String word : doc) { 11 if (term.equalsIgnoreCase(word)) 12 result++; 13 } 14 return result / doc.size(); 15 } 16 17 public static void main(String[] args) { 18 String str = new String("//*英文"); 19 20 String doc2 = str.split(" "); 21 double tf1 = tf(str, doc2); 22 for(String words : doc2){ 23 if(!str.equalsIgnoreCase(words)){ 24 System.out.print(doc2 + ":"); 25 System.out.println(tf1); 26 } 27 } 28 } 29}

このようなエラーが出てきます。
TF1.java:23: null {5}のtf(java.util.List<java.lang.String>,java.lang.String) TF1は指定された型に適用できません
期待値:
検出値: java.lang.String,java.lang.String
double tf1 = tf(str, doc2);
^ ^
エラー1個

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/12/18 15:25

「どうしてもうまくできません」だとあなたがどの程度Javaの知識をお持ちなのか判断が難しいです。まずはプログラム全体について「うまくいかない」ではなく「この処理がうまく動かない」のように問題を特定のメソッドの動きなどに絞ってコードを明示して質問してみるとよいでしょう。問題を局所化できない質問はたいてい「丸投げ質問」として敬遠されてしまう傾向があります。
manchester

2016/12/18 17:10

失礼しました。こちらで質問するのが初めてだったので、すみません。プログラムを追加しました。こちらのエラーの改善方法の指摘お願いします。
KSwordOfHaste

2016/12/18 17:14

注文が多くてすみませんが、<code>ボタンを使って正しく字下げしていただけるとベターです。編集によってプログラムが変わってしまってますが、上記のプログラムが最終的なものですか?HashMapを使って正しくカウントできていそうなプログラムだったのですがその部分がなくなってしまってますよ?
manchester

2016/12/18 17:33

字下げしてみます。TFの関数を作るプログラムとmainでTFを作るプログラムの2パターン作ってみました。編集前の方が良いですか?
KSwordOfHaste

2016/12/18 17:39

2つアドバイスがあります。(1)コードの内容を頻繁に変更するのはやめた方がよいです。回答を書いてくれている途中の人がいた場合、無暗に質問を変えると回答者の努力が無駄になります。(2)<code>を押すと```改行```のようになると思いますが、```で挟まれた部分にコードを書いてください。そうしないと字下げできません。字下げは半角スペースで(面倒ですけど)。
退会済みユーザー

退会済みユーザー

2016/12/18 17:45

String doc2 = str.split(" ");  ×  String[] doc2 = str.split(" "); ◎
guest

回答3

0

java初心者さんと言う事で
お困りのようですので
簡単にアドバイスをさせて頂きます。

>Javaで英文テキストファイルを読み込み
この部分についてですが
javaの場合簡単に実装可能です
指定ファイルからテキストファイルを読み込んで
プログラムで処理をする...と言う形になります。
詳しくは調べたら簡単に出てきますのでぜひお試しください。

>英単語のTFIDFを表示させるプログラム
私が予想した限りでは
この部分はやや難易度が高いと思われますが
調べたらすぐにTFIDFサンプルプログラムが
ネットで見つかりました。

細かい仕様がわかりませんが
簡単に実装可能だと思いますので
詳しくは調べたら簡単に出てきますのでぜひお試しください。

>TFのみを表示させるプログラムでも良いので教えてください。
流れだけでもよいのでお願いします。

これもネット上にサンプルプログラムが
有りますので
ぜひ検索をかけてトレースしてみてください


デバッグの仕方がわからないとか
検索の仕方がわからない等
初心者プログラマーの方は(私も初心者ですが)
まずは解決する方法を調べるのが良いと思います。

近年疑問に思った事は
簡単にネットで検索をかければ出てきますので
流れが教えて欲しいのですが~系の
ご質問でしたらまずは
似たようなプログラムが
あちらこちらに点在していますので
トレースしてみてはいかがでしょうか?

トレースしたうえで
この部分がわからないから
教えて欲しい~等
疑問に思う部分もまた湧いてくると
思います。

その時はまたいつでもご質問ください。

投稿2016/12/18 15:38

dec5798

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manchester

2016/12/18 17:07

コメントありがとうございます。検索しどれをトレースしてもどうしてもエラーが出てきてしまいます。 プログラムを追加したのでどこが間違えているのか指摘お願いします。
guest

0

コードが提示されましたね。とりあえずは

TF1.java:22: 互換性のない型

期待値: java.lang.String
検出値: java.lang.String[]

String doc2 = str.split(" "); //誤り
String[] doc2 = str.split(" "); //こちらが正しい

doc2の型の宣言が間違っているわけです。後の方はその影響で出ていたりしますね。初心者のうちは最初のエラーを直してからコンパイルして・・・というのを繰り返した方がいいかも知れません。変数の型の宣言を間違えていたりするとそれ以降エラーが沢山でてしまうので一度になおそうとしても難しいからです。


追記:降順

変更後のコードではtfメソッドで出現頻度を返すようになってますね。これで単語と頻度が順番に求まりますが、降順に表示するには並べ替え(ソート)をする必要があります。ソートにはいろいろやり方がありますが、単語と頻度のように複数の要素を一塊としたデータをソートする例を挙げます。

追記:
失礼、最初の例は間違ってました。List.sortはComparatorを渡さないといけないのでした。
なお下記の例は動作確認してません。
他の方の回答も参考にして「プログラムのエラーを直す」ことを学んでいただければと思います。

java

1// 単語と頻度を保持するクラスを作る 2class WordAndFreq { 3 String word; 4 double freq; 5 WordAndFreq(String word, double freq) { 6 this.word = word; 7 this.freq = freq; 8 } 9} 10... 11// まず頻度を調べながらWordAndFreqをListの要素として蓄積 12List<WordAndFreq> list = new List<>(); 13for (String word : doc2) { 14 list.add(new WordAndFreq(word, tf(doc2, word))); 15} 16// Listをソート 17list.sort(new Comparator<WordAndFreq>() { 18 @Override 19 public int compare(WordAndFreq o1, WordAndFreq o2) { 20// return Double.compare(o1.freq, o2.freq); //昇順 21 return Double.compare(o2.freq, o1.freq); //降順 22 } 23}); 24// ソート結果を表示 25for (WordAndFreq wf : list) { 26 System.out.format("%s: %4.1f\n", wf.word, wf.freq); 27} 28...

投稿2016/12/18 17:44

編集2016/12/18 18:20
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manchester

2016/12/18 17:55

ありがとうございます。型を変更した結果エラーが1つになりました。 こちらのエラーはどのような意味でしょうか?
KSwordOfHaste

2016/12/18 17:57

String[]型の値をList<String>型を必要とするメソッドへ渡そうとしているからです。 とりあえずメソッドの引数の型をString[]に直せばよいです。
manchester

2016/12/18 18:05

public double tf(String[] doc, String term) { と変えてみたのですが、同じエラーが出てしまいます。 どうすればよいでしょうか?
KSwordOfHaste

2016/12/18 18:08

引数の順番が逆になってませんか?プログラムは慎重に見直してください。
manchester

2016/12/18 18:16

逆になっていました。無事おそらくTFが表示できました。ありがとうございます。 重複した単語を表示させなかったり、ソートで並び替えて表示させることは可能ですか?
KSwordOfHaste

2016/12/18 18:23

一応ソートの例を載せました。ただし、私の回答よりdec5798さんがおっしゃることの方が大事だと思います。わからないことを全部尋ねる前にご自分で調べてみることが大事です。
guest

0

ベストアンサー

以下は文章を複数のファイルに分けて入れて
それをコンソール上で入力し、入力し終わったらendを入力すると
出力ファイルに結果のtf,idf,tfidfが出力されるコードです

java

1import java.util.*; 2import java.io.*; 3 4public class SHQ { 5 6 static ArrayList<ArrayList<String>> c = new ArrayList<ArrayList<String>>(); 7 8 static ArrayList<String> nam = new ArrayList<String>(); 9 10 public static void main(String[] args) { 11 12 try (BufferedWriter bw = new BufferedWriter(new FileWriter("write.txt"))) {// 結果出力ファイル名 13 bw.write("start"); 14 bw.newLine(); 15 } catch (Exception e) { 16 } 17 18 Console co = System.console(); 19 System.out.print("file name:"); 20 String st = ""; 21 while (!(st = co.readLine()).equals("end")) { 22 23 ADD(st); 24 nam.add(st); 25 System.out.print("file name:"); 26 } 27 System.out.println("end"); 28 STT(); 29 30 } 31 32 static void STT() { 33 34 try (BufferedWriter bw = new BufferedWriter(new FileWriter("write.txt", 35 true))) { 36 int count = 0; 37 for (ArrayList<String> q : c) { 38 bw.write(nam.get(count) + "ファイルのtf,idf,tf×idf"); 39 bw.newLine(); 40 for (String w : q) { 41 bw.write("単語" + w + "のtf:"); 42 int count2 = 0; 43 for (String f : q) { 44 if (f.equals(w)) 45 count2++; 46 } 47 bw.write("" + (double) count2 / q.size()); 48 bw.newLine(); 49 50 bw.write("単語" + w + "のidf:"); 51 int couny = 0; 52 for (ArrayList<String> y : c) { 53 54 for (String h : y) { 55 if (w.equals(h)) { 56 couny++; 57 break; 58 } 59 } 60 61 } 62 // System.out.println((double)c.size()/couny); 63 double asd = Math.log((double) c.size() / couny) + 1; 64 bw.write("" + asd); 65 bw.newLine(); 66 bw.write("単語" + w + "のtf×idf:" 67 + (Math.log((double) c.size() / couny) + 1) 68 * ((double) count2 / q.size())); 69 bw.newLine(); 70 bw.newLine(); 71 } 72 count++; 73 bw.newLine(); 74 bw.newLine(); 75 bw.newLine(); 76 bw.newLine(); 77 } 78 79 } catch (Exception e) { 80 System.out.print("allerr"); 81 } 82 83 } 84 85 static void ADD(String s) { 86 87 ArrayList<String> a = null; 88 89 try (BufferedReader br = new BufferedReader(new FileReader(s))) { 90 a = new ArrayList<String>(); 91 92 String data = ""; 93 94 while ((data = br.readLine()) != null) { 95 96 String[] aa = data.split(" +"); 97 98 for (String sd : aa) { 99 a.add(sd); 100 } 101 102 } 103 104 } catch (Exception e) { 105 System.out.println("err3"); 106 } 107 if (a != null) { 108 c.add(a); 109 } 110 111 } 112 113

質問文のエラーを訂正したものが以下です

java

1import java.util.List; 2import java.lang.String; 3 4/** 5 * doc 文書 term 用語 6 */ 7public class TF1 { 8 public static double tf(String term, String[] doc) { 9 double result = 0; 10 for (String word : doc) { 11 if (term.equalsIgnoreCase(word)) 12 result++; 13 } 14 return (double) result / doc.length; 15 } 16 17 public static void main(String[] args) { 18 String str = "It is a Java beginner who is studying Java by self taught. I'd like to create a program that reads English text files in Java and displays TFIDF of each English word, but I can not do it well by all means. I tried to make only TF. I do not know the meaning of the error. Since I do not know how to read the file, I typed in English directly. I omitted it here because it is long. I also want to display descending order"; 19 20 String[] doc2 = str.split(" "); 21 22 for (String words : doc2) { 23 double tf1 = tf(words, doc2); 24 if (!str.equalsIgnoreCase(words)) { 25 System.out.print(words + ":"); 26 System.out.println(tf1); 27 } 28 } 29 } 30}

重複したものを表示させない・降順ソートした表示は以下です

java

1import java.util.*; 2import java.lang.String; 3 4/** 5 * doc 文書 term 用語 6 */ 7public class TF1 { 8 public static double tf(String term, String[] doc) { 9 double result = 0; 10 for (String word : doc) { 11 if (term.equalsIgnoreCase(word)) 12 result++; 13 } 14 return (double) result / doc.length; 15 } 16 17 public static void main(String[] args) { 18 String str = "It is a Java beginner who is studying Java by self taught. I'd like to create a program that reads English text files in Java and displays TFIDF of each English word, but I can not do it well by all means. I tried to make only TF. I do not know the meaning of the error. Since I do not know how to read the file, I typed in English directly. I omitted it here because it is long. I also want to display descending order"; 19 20 String[] doc2 = str.split(" "); 21 TreeMap<String,Double> c=new TreeMap<>(); 22 23 for (String words : doc2) { 24 double tf1 = tf(words, doc2); 25 if (!str.equalsIgnoreCase(words)) { 26 c.put(words,tf1); 27 } 28 29 } 30System.out.println("重複した単語を表示させない"); 31 for(String er:c.keySet()){ 32 System.out.println(er+":"+c.get(er)); 33 } 34 TreeMap<String,Double> c2=new TreeMap<>(new CX(c)); 35c2.putAll(c); 36System.out.println("\n\n降順にソート"); 37 38for(String er:c2.keySet()){ 39 System.out.println(er+":"+c.get(er)); 40 } 41 } 42 43 44} 45 46class CX implements Comparator<String> { 47 private Map<String, Double> map; 48 public CX(Map<String, Double> map) { 49 this.map = map; 50 } 51 public int compare(String key1, String key2) { 52 double value1 = map.get(key1); 53 double value2 = map.get(key2); 54 if(value1 == value2) 55 return key1.toLowerCase().compareTo(key2.toLowerCase()); 56 else if(value1 < value2) 57 return 1; 58 else 59 return -1; 60 } 61} 62

投稿2016/12/18 17:09

編集2016/12/18 19:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manchester

2016/12/18 18:09

ありがとうございます。ちなみに降順に並べ替えることは可能でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問