2016-11-08 1 views
2

私はトピックの各単語に割り当てられた重みがMalletでどのようなものであるかを調べようとしています。マレットでトピックの単語の重みがどのように計算されますか?

私はそれが何らかの形の文書発生カウントであると仮定しています。しかし、私はその人物がどのように到着したかを理解するのに苦労しています。

私のモデルでは、複数のトピックに複数の単語があり、それぞれのトピックに異なる重みが割り当てられているため、数字はコーパス全体の単語数ではありません。私の次の推測では、トピックに割り当てられているドキュメントの総数のうち単語の出現数が数字であることが推測されましたが、手動で検証しようとすると、これは正しくないようです。

例:約12,000のドキュメント(アルファ0.1、ベータ0.01、t = 50)のコーパスをモデルにしてトレーニングしています。

t1 = "knoflook (158.0), olie (156.0), ...." 

私は手動でが持っている単語が含まれている私のコーパスにおけるドキュメントの数をカウントしたときに単語「knoflookは」しかし、158の重みを割り当てられているので:訓練の後、私のモデルは、以下のトピックがありますt1が割り当てられましたが、私は全く異なる番号(1855)を取得します。

私の手作業による検証はオフになっている可能性がありますが、一般的に各トピックの単語の重さがどのように到達しているかを知ることは有用です。ところで

、上記のトピックは、次のコードに基づいて、レンダリングされ:

// The data alphabet maps word IDs to strings 
    Alphabet dataAlphabet = instances.getDataAlphabet(); 

    // Get an array of sorted sets of word ID/count pairs 
    ArrayList<TreeSet<IDSorter>> topicSortedWords = topicModel.getSortedWords(); 

    for (int t = 0; t < numberOfTopics; t++) { 
      Iterator<IDSorter> iterator = topicSortedWords.get(t).iterator(); 
      StringBuilder sb = new StringBuilder(); 
      while (iterator.hasNext()) { 
       IDSorter idWeightPair = iterator.next(); 
       final String wordLabel = dataAlphabet.lookupObject(idWeightPair.getID()).toString(); 
       final double weight = idWeightPair.getWeight(); 
       sb.append(wordLabel + " (" + weight + "), "); 
      } 
      sb.setLength(sb.length() - 2); 

      // sb.toString is now a human-readable representation of the topic 
    } 

答えて

2

マレットは、トピックにトークン各ワードを割り当てます。 getSortedWords()メソッドは、のトークンが特定のタイプ(たとえば、knoflook)の単語の数をカウントし、トピックkにも割り当てられます。ドキュメントへのトークンの分割は、この計算には関係ありません。

私が正しく理解していた場合は、タイプのワードトークンがをknoflookも話題T1に割り当てられた単語・トークンを持ってい1855個の文書があることを発見しています。しかし、これらの2つのトークンが同じであるという保証はありません。

レシピを見ている他の作業からは、ニンニクは多くの状況で発生する共通の成分であり、おそらく多くのトピックで高い可能性があると思います。多くの単語のインスタンスが他のトピックに割り当てられているのは驚くことではありません。

+0

ありがとう、非常に明確に説明しました。 –

関連する問題