6

私は文の類似性に関するプロジェクトに取り組んでいます。SOで何度も尋ねられたことは知っていますが、私がやっている方法で問題を解決できるかどうか、または問題へのアプローチを変更する必要があるかどうかを知りたいだけです。大まかに言えば、システムは記事のすべての文を分割し、システムに供給される他の記事の中から類似の文を見つけることになっています。

私は tf-idf 重みで余弦類似度を使用しています。それが私が行った方法です。

1- まず、すべての記事を文に分割し、次に文ごとにトライグラムを生成して並べ替えます (すべきでしょうか?)。

2- トリグラムの tf-idf 重みを計算し、すべての文のベクトルを作成します。

3- 元の文と比較する文の内積と大きさを計算します。次に、コサイン類似度を計算します。

しかし、システムは期待どおりに機能しません。ここで、いくつか疑問があります。

私が tf-idf の重みについて読んだ限りでは、同様の「ドキュメント」を見つけるのにより便利だと思います。私は文に取り組んでいるので、tf および idf 定義の式のいくつかの変数を変更して、アルゴリズムを少し変更しました (ドキュメントの代わりに、文ベースの定義を考え出そうとしました)。

tf = 文中のトライグラムの出現回数 / 文中のすべてのトライグラムの数

idf = 全記事の全文数 / トライグラムが出現する文数

この問題にそのような定義を使用しても問題ないと思いますか?

もう1つは、コサイン類似度を計算するときに正規化が何度も言及されているのを見たことです。トライグラムのベクトルが同じサイズではない可能性があるため、これは重要であると推測しています(私の場合はめったにありません)。トライグラム ベクトルのサイズが x で、もう一方のベクトルが x+1 の場合、最初のベクトルを x+1 のサイズとして扱い、最後の値は 0 です。これは正規化の意味ですか? そうでない場合、正規化を行うにはどうすればよいですか?

これらに加えて、間違ったアルゴリズムを選択した場合、そのような問題に他に何が使用できますか(できればn-gramアプローチを使用)?

前もって感謝します。

4

1 に答える 1

6

すべての文のトリグラムをソートしている理由がわかりません。コサイン類似度を計算するときに気にする必要があるのは、同じトライグラムが 2 つの文で発生したかどうかと、どのような頻度で発生したかということだけです。概念的に言えば、考えられるすべてのトライグラム間で固定された共通の順序を定義します。順序はすべての文で同じでなければならないことに注意してください。可能なトライグラムの数が N の場合、各文に対して次元 N のベクトルを取得します。特定のトライグラムが発生しない場合は、ベクトル内の対応する値をゼロに設定します。ゼロを実際に保存する必要はありませんが、内積を定義するときにそれらを処理する必要があります。

そうは言っても、一致の可能性がはるかにまばらであるため、トライグラムは良い選択ではありません. 高 k の場合、k グラムではなく、k 連続単語のバッグからより良い結果が得られます。順序は袋の中で重要ではなく、セットであることに注意してください。あなたは k=3 k-grams を使用していますが、特に文の場合、それは高い側にあるようです。バイグラムにドロップダウンするか、1 から始まるさまざまな長さのバッグを使用します。できれば両方を使用してください。

正確なトリグラムを使用していない文は、あなたの方法では類似性が0であることに気付いたと思います. K-bag of words は状況をいくらか緩和しますが、完全に解決するわけではありません。実際の単語を共有するには文章が必要だからです。2 つの文は、同じ単語を使用しなくても似ている場合があります。これを修正するには、いくつかの方法があります。LSI (latent Semantic Indexing) または単語のクラスタリングを使用し、クラスタ ラベルを使用してコサイン類似度を定義します。

ベクトル x と y の間のコサイン類似度を計算するには、内積を計算し、x と y のノルムで割ります。ベクトル x の 2 ノルムは、成分の 2 乗和の平方根として計算できます。ただし、比較する正規化なしでアルゴリズムを試してみてください。項の頻度 (tf) を計算するときに、文の相対的なサイズを既に処理しているため、通常は問題なく機能します。

お役に立てれば。

于 2010-10-27T20:27:52.520 に答える