アプリ版:「スタンプのみでお礼する」機能のリリースについて

java初心者です。a.txtファイルを読み込みTFIDFを計算し画面にその単語とTFIDFを表示するプログラムを作りたいのですが、下のようなエラーが出てしまいます。どこが違うのかわかる方教えてください。
又、根本的に間違えていたらそこを指摘していただいて結構です。
よろしくお願いします。

import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.io.*;
import java.io.BufferedReader;
import java.util.HashMap;

public class TFIDFCalculator{
public double tf(List<String> doc, String term) {
double result = 0;
for (String word : doc) {
if (term.equalsIgnoreCase(word))
result++;
}
return result / doc.size();
}

public double idf(List<List<String>> docs, String term) {
double n = 0;
for (List<String> doc : docs) {
for (String word : doc) {
if (term.equalsIgnoreCase(word)) {
n++;
break;
}
}
}
return Math.log(docs.size() / n);
}
public double tfIdf(List<String> doc, List<List<String>> docs, String term) {
return tf(doc, term) * idf(docs, term);

}

public static void main(String[] args)throws IOException{
File file = new File("a.txt");
FileReader filereader = new FileReader(file);
BufferedReader br = new BufferedReader(filereader);
HashMap<String,Integer> tm = new HashMap<String,Integer>();
String line;
while((line = br.readLine()) != null){
String[] str = line.split("[\'\"(){}<>, :;\\.]");
}
for(String t : str){         ←64
if(!tm.containsKey(t)){
tm.put(t,1);
}else{
tm.put(t,tm.get(t).intValue()+1);

TFIDFCalculator calculator = new TFIDFCalculator();
double tfidf = calculator.tfIdf(br,line, tm);      ←73     
for(String s : tm.keySet()){
System.out.println(s + tfidf);
}
}

}
}



TFIDFCalculator.java:64: シンボルを見つけられません
シンボル: 変数 str
場所: クラス TFIDFCalculator
for(String t : str){
^
TFIDFCalculator.java:73: null {5}のtfIdf(java.util.List<java.lang.String>,java.util.List<java.util.List<java.lang.String>>,java.lang.String) TFIDFCalculatorは指定された型に適用できません
期待値:
検出値: java.io.BufferedReader,java.lang.String,java.util.HashMap<java.lang.String,java.lang.Integer>
double tfidf = calculator.tfIdf(br,line, tm);
^
エラー2個

質問者からの補足コメント

  • うーん・・・

    解答ありがとうございます。
    解答していただいたプログラムを実行したのですが以下のエラーが出てきました。
    ArrayListの横の<>はどのように訂正するべきでしょうか?

    DP7.java:45: 型の開始が不正です
    List<List<String>> as2=new ArrayList<>();
    ^
    DP7.java:48: 型の開始が不正です
    List<String> tt=new ArrayList<>();
    ^
    エラー2個

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/12/17 01:16

A 回答 (3件)

こちらの環境ではコンパイルできたのですが


とりあえずListをArrayListにして実行できる形に再訂正して見ました
以下が訂正したプログラムです

import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.io.*;
import java.io.BufferedReader;
import java.util.HashMap;

public class DP7{
public double tf(ArrayList<String> doc, String term) {
double result = 0;
for (String word : doc) {
if (term.equalsIgnoreCase(word))
result++;
}
return (double)result / doc.size();
}

public double idf(ArrayList<ArrayList<String>> docs, String term) {
double n = 0;
for (ArrayList<String> doc : docs) {
for (String word : doc) {
if (term.equalsIgnoreCase(word)) {
n++;
break;
}
}
}
return Math.log((double)(docs.size()/n));
}
public double tfIdf(ArrayList<String> doc, ArrayList<ArrayList<String>> docs, String term) {
return tf(doc, term) * idf(docs, term);

}

public static void main(String[] args)throws IOException{

String sear="単語";//探す単語

File file = new File("ファイル.txt");//ファイル名
FileReader filereader = new FileReader(file);
BufferedReader br = new BufferedReader(filereader);
String line;
String[] str=null;

ArrayList<ArrayList<String>> as2=new ArrayList<>();
while((line = br.readLine()) != null){

ArrayList<String> tt=new ArrayList<>();

str = line.split("[\'\"(){}<>, :;\\.]");

for(String t : str){
tt.add(t);

}


as2.add(tt);
}

for(ArrayList<String> sss:as2){
DP7 calculator = new DP7();
double tfidf = calculator.tfIdf(sss,as2,sear);
double tf = calculator.tf(sss,sear);
double idf = calculator.idf(as2,sear);

String h="";
for(String s : sss){
h+=s;
}
System.out.println(h +"tf:"+tf+" idf:"+idf+" tf-idf:"+ tfidf);
}

}
}
    • good
    • 0

以下でできるのではないでしょうか


訂正して作ったので全体への指摘と言えないこともないように思います
上の顕著な間違いを挙げるなら、

HashMapはListではなくMapで、上記ではHashMapとして扱うべき
だが、そもそも今回はHashMapを使う必要がない

strを{}の中で宣言した場合、その外では使えない

です

import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.io.*;
import java.io.BufferedReader;
import java.util.HashMap;

public class DP7{
public double tf(List<String> doc, String term) {
double result = 0;
for (String word : doc) {
if (term.equalsIgnoreCase(word))
result++;
}
return (double)result / doc.size();
}

public double idf(List<List<String>> docs, String term) {
double n = 0;
for (List<String> doc : docs) {
for (String word : doc) {
if (term.equalsIgnoreCase(word)) {
n++;
break;
}
}
}
return Math.log((double)(docs.size()/n));
}
public double tfIdf(List<String> doc, List<List<String>> docs, String term) {
return tf(doc, term) * idf(docs, term);

}

public static void main(String[] args)throws IOException{

String sear="探す単語";//探す単語

File file = new File("s.txt");//ファイル名
FileReader filereader = new FileReader(file);
BufferedReader br = new BufferedReader(filereader);
String line;
String[] str=null;

List<List<String>> as2=new ArrayList<>();
while((line = br.readLine()) != null){

List<String> tt=new ArrayList<>();

str = line.split("[\'\"(){}<>, :;\\.]");

for(String t : str){
tt.add(t);

}


as2.add(tt);
}

for(List<String> sss:as2){
DP7 calculator = new DP7();
double tfidf = calculator.tfIdf(sss,as2,sear);
double tf = calculator.tf(sss,sear);
double idf = calculator.idf(as2,sear);

String h="";
for(String s : sss){
h+=s;
}
System.out.println(h +"tf:"+tf+" idf:"+idf+" tf-idf:"+ tfidf);
}

}
}
この回答への補足あり
    • good
    • 0

その 1つ上の行にある


}
はなにをしたいんでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!