Weka では、クラスStringToWordVectorはsetNormalizeDocLengthというメソッドを定義します。ドキュメントの単語頻度を正規化します。私の質問は次のとおりです。
- 「ドキュメントの単語頻度を正規化する」とはどういう意味ですか?
- Wekaはこれをどのように行いますか?
実際の例が最も役立ちます。前もって感謝します。
Weka では、クラスStringToWordVectorはsetNormalizeDocLengthというメソッドを定義します。ドキュメントの単語頻度を正規化します。私の質問は次のとおりです。
実際の例が最も役立ちます。前もって感謝します。
Weka のソースを見ると、これが正規化を行うメソッドです。
private void normalizeInstance(Instance inst, int firstCopy) throws Exception
{
double docLength = 0;
if (m_AvgDocLength < 0)
{
throw new Exception("Average document length not set.");
}
// Compute length of document vector
for(int j=0; j<inst.numValues(); j++)
{
if(inst.index(j)>=firstCopy)
{
docLength += inst.valueSparse(j) * inst.valueSparse(j);
}
}
docLength = Math.sqrt(docLength);
// Normalize document vector
for(int j=0; j<inst.numValues(); j++)
{
if(inst.index(j)>=firstCopy)
{
double val = inst.valueSparse(j) * m_AvgDocLength / docLength;
inst.setValueSparse(j, val);
if (val == 0)
{
System.err.println("setting value "+inst.index(j)+" to zero.");
j--;
}
}
}
}
最も関連性の高い部分のようです
double val = inst.valueSparse(j) * m_AvgDocLength / docLength;
inst.setValueSparse(j, val);
したがって、正規化は のように見えますvalue = currentValue * averageDocumentLength / actualDocumentLength
。