2012-03-02 5 views
1

注:ソースコードには複数のクラスが含まれていますので、時間のために私は投稿しません。私がうまく説明できないなら、許してください。私はこれについて多くのことをしてきましたが、私の説明は私には意味がありますが、他人には理解できないかもしれません。Java: "上位のカテゴリ"タスクのためにarraylistsを互いに結びつけてください

私はどのカテゴリのユーザー入力が属するのかを判断する作業があります。たとえば、ユーザーが入力した場合:私は犬と猫が大好きです。 プログラムは、トップ2のカテゴリー出力すること: 犬、 猫

ユーザーが入力のみ場合

:「私は犬を愛する」は、プログラムが出力として上位2カテゴリ「犬は、他のカテゴリが見つからない」だろう

カテゴリーが1つしか見つからないか、まったく見つからない場合は、「カテゴリなし」がデフォルトの応答です。

私は以下のカテゴリの配列リストを作成しました:犬、猫、鳥。これらのarraylistsには、ユーザ入力がどのカテゴリに入るのかをプログラムが認識するようにするキーワードが含まれています。

私は基本的に、可能性の最も高い尤度と2番目に高い尤度を得る必要があります。カテゴリが何であるかを出力します。

これは私のコードです。これは、上位2つの可能性を上位に持ち、それらをコンソールに出力しようとします。 私の問題は、それぞれの文字列にリンクするカテゴリを取得して、最も高い可能性のあるカテゴリが出力されるようにします。

ユーザ入力:

//Create prioritization 
    int topDouble = 0; 
    String topString = "no category"; //default response 
    int secondDouble = 0; 
    String secondString = "no category"; // default response 

    ArrayList<Double> likelyDouble = new ArrayList<Double>(); 
    likelyDouble.add(cats); 
    likelyDouble.add(dogs); 
    likelyDouble.add(birds); 

    ArrayList<String> likelyString = new ArrayList<String>(); 
    likelyString.add("you talked about cats"); 
        //to parallel likelyDouble cats category 
    likelyString.add("you talked about dogs"); 
        //to parallel likelyDouble dogs category 
    likelyString.add("you talked about birds"); 
        //to parallel likelyDouble cats category 

    int count = 0; 
    for (double d : likelyDouble){ 
     if((d>0) && (d > topDouble)){ 
      topDouble = (int) d; 
      topString = likelyString.get(count); 
     } 
     else if((d>0) && (d > secondDouble)){ 
      secondDouble = (int) d; 
      secondString = likelyString.get(count); 
     } 
    } 

    System.out.print(topString + "\n"); 
    System.out.print(secondString); 

出力は、私はデフォルトを取得し は私が犬や猫が好き。

なしカテゴリ

FYIプログラムは、ユーザーが特定のカテゴリについて話されている可能性がカテゴリが参照された回数の文と数の位置に基づいて決定します。尤度は計算された値です。カテゴリがまったく言及されていない場合は、尤度は0です。

ありがとうございました!

+0

'count'は決してインクリメントされないので、あなたのプログラムによれば、_あなたは猫について話していて_ _" Dogs "としか言わない' likelyString'の最初の要素をいつも得られます_ –

+0

なぜなら二?実際には、見つかったカテゴリの_list_を返してください。どのカテゴリでもかまいません。あなたは確かに2つの要素を見直すことはできませんが、将来この制限があるかもしれません。ああ...そしてシソーラスを基本的に作ってみたいと思っています - 私はちょうど「犬」に入れるとどうなりますか?それで、最低限、複数のハッシュマップを使って作業をしてください。 –

答えて

0

私ははっきりとあなたが後にしているのか理解していないが、私はそれはあなたのキャストとは何かを持っている疑いがある:

topDouble = (int) d; 

あなたは常に0にtopDoubleを設定する - likelyhoodが範囲内にあると仮定すると、[0、 1]。
secondDoubleと同じです。

topDoublesecondDoubledoubleと宣言し、キャストをintに削除して、最大/秒の2倍の値を取得したかったとします。

さらに、私はあなたがcountを増やすのを見ることができないので、いつもget()の最初の要素はArrayListです。

[私の意見で]より良いアプローチのためだけ 設計thaught


新しいクラスを作成します:2つのフィールド、1とLikelyhoodStringDoubleStringあり、他方はdoubleです。 [doubleの値に基づいてComparableを実装するようにします。

あなたが今行う必要がありますすべては、リストをソートするCollections.sort()を使用して、あなたが望むトップk個の要素を取得している

0

[= 2、あなたのケースKに]私はあなたが権利を取得した場合は、試してみることができますマップを使用して、ユーザーが入力できるすべての入力に対してカテゴリの可能性を保存します。与えられた

サンプル:

List<String> categories = new ArrayList<String>(); 
categories.add("dogs"); 
categories.add("cats"); 
categories.add("birds"); 
Map<String, Double> counterMap = new HashMap<String, Double> 
for(String s : categories) { 
    counterMap.put(s, 0); 
} 
List<String> inputString = new ArrayList<String>(); 
inputString.add("you talked about cats"); 
inputString.add("you talked about dogs"); 
inputString.add("you talked about birds"); 
for(String s : inputString) { 
    for(String s2 : categories) { 
     //get the likelyhood of the category in the sentence 
     Double d = getLikelyhood(s2, s); 
     //add the likelyhood in your map 
     map.put(s2, map.get(s2) + d); 
    } 
} 

//after setting the likelyhood of the categories with the user input 
//you just need to get the 2 major values in the map 
//I'll let you a small algorithm for this 
int x = 0; 
String[] arrS = new String[m.size()]; 
for(Object o : m.keySet().toArray()) { 
    arrS[x++] = (String)o; 
} 
x = 0; 
Double[] arrI = new Double[m.size()]; 
for(Object o : m.values().toArray()) { 
    arrI[x++] = (Double)o; 
} 
int max1, max2, posMax1, posMax2; 
max1 = arrI[0]; 
max2 = arrI[0]; 
posMax1 = 0; 
posMax2 = 0; 
for(int i=1; i < arrI.length; i++) { 
    if (arrI[i] >= max1) { 
     max2 = max1; 
     max1 = arrI[i]; 
     posMax2 = posMax1; 
     posMax1 = i; 
    } else if (arrI[i] > max2) { 
     max2 = arrI[i]; 
     posMax2 = i; 
    } 
} 
System.out.println("Max category: " + arrS[posMax1]); 
System.out.println("Second Max category: " + arrS[posMax2]); 

が、これはあなたのお役に立てば幸いです。

+0

私たちはHashMapにまだ参加していないので、私はそれを快適に使用することはできません。でもありがとう! – user1245957

関連する問題