3

Difflib.SequenceMatcherを使用して、2つのファイル間の類似性を計算しようとしています。これらの2つのファイルは、1つに余分な空白、空の行が含まれ、他のファイルには含まれないことを除いて、ほとんど同じです。使用しようとしています

s=difflib.SequenceMatcher(isjunk,text1,text2)
ratio =s.ratio()

この目的のために。

したがって、問題は、このisjunkメソッドのラムダ式をどのように記述してSequenceMatcherメソッドがすべての空白、空の行などを割り引くかです。パラメーターlambda x:x == ""を使用しようとしましたが、結果はそうではありません。素晴らしい。よく似た2つのテキストの場合、比率は非常に低くなります。これは非常に直感的ではありません。

テストの目的で、テストに使用できる2つの文字列を次に示します。

jwovuがあなたの仕事をうまくやる動機は何ですか?OK、これは私が読んでいないという事実にもかかわらず、100ドル相当のソフトウェア開発の本を獲得しようとしているエントリです

プログラミングの本。賞品を獲得するには、エントリーと
、fggmumが仕事を上手くやる動機を書く必要があります。したがって、この投稿。最初の動機

お金。これは多くの人にとって大きなインスピレーションのようには思えません。お金がモチベーションの要因の1つであると言うことは、私のチャンスを吹き飛ばすかもしれません。

まるでお金がプログラミングの世界ではタブーであるかのように。お金でやる気が出ない人もいると思います。一方、Mmeは現実の世界に住んでいます。

住宅ローンを支払い、私自身が食事をし、請求書をカバーします。ですから、私は自分の検討からお金を本当に除外することはできません。のために多額のお金を得ることができれば

良い仕事をして、それから間違いなく私の士気を高めます。古いワークステーションを使用しているのか、部屋やキュービクルを他の人と共有することを余儀なくされているのかは気にしません

人々、または迷惑な上司、または何でも我慢する必要があります。一日の終わりに私がたくさんのお金を持って立ち去るという事実自体で十分です

私がすべての障害を克服し、すべての困難な感情に耐え、エゴを傷つけ、遅いコンピューターに耐え、さらには耐えることができるように

そして、ここに別の文字列があります

仕事を上手くやる動機は何ですか?OK、これは私がプログラミングの本を読んでいないという事実にもかかわらず、100ドル相当のソフトウェア開発の本を獲得しようとしているエントリです。賞品を獲得するには、エントリーを作成し、仕事を上手くやる動機を説明する必要があります。したがって、この投稿。

最初の動機、お金。これは多くの人にとって大きなインスピレーションのようには思えません。お金がモチベーションの要因の1つであると言うことは、私のチャンスを吹き飛ばすかもしれません。まるでお金がプログラミングの世界ではタブーであるかのように。お金でやる気が出ない人もいると思います。彼らへの称賛。一方、私は現実の世界に住んでおり、住宅ローンを支払い、自分自身を養い、請求書をカバーしています。ですから、私は自分の検討からお金を本当に除外することはできません。

良い仕事をするために多額のお金を稼ぐことができれば、それは間違いなく私の士気を高めるでしょう。古いワークステーションを使用しているのか、部屋やキュービクルを他の人と共有することを余儀なくされているのか、迷惑な上司に我慢しなければならないのか、などは気にしません。一日の終わりに私がたくさんのお金を持って立ち去るという事実は、私がすべての障害を克服し、すべての困難な感情に耐え、エゴを傷つけ、遅いコンピューターに耐え、さらには耐えるのに十分です

上記のコマンドを実行し、isjunkをlambda x:x==""に設定しました。比率はわずか0.36です。

4

4 に答える 4

7

すべての空白を一致させると、類似性が向上します。

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio()

ただし、これらは 2 つのほぼ同一のドキュメントであるため、difflib はこのような問題には理想的ではありません。

tf-idfベイジアン確率ベクトル空間モデル、およびw-shinglingを読んでみてください

tf-idfをベクトル空間に適用し、ドキュメントを分類するための距離尺度として内積を使用する実装を作成しました。

于 2008-09-29T07:17:02.400 に答える
2

上記のテキストを考えると、テストは確かに提案されたとおりです。

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio()

ただし、処理を少し高速化するために、CPythonのメソッドラッパーを利用できます。

difflib.SequenceMatcher(" \t\n".__contains__, doc1, doc2).ratio()

これにより、多くのPython関数呼び出しが回避されます。

于 2008-09-29T11:48:48.457 に答える
2

サンプル文字列の使用:

>>> s=difflib.SequenceMatcher(lambda x: x == '\n', s1, s2)
>>> s.ratio()
0.94669848846459825

興味深いことに、' ' もジャンクとして含まれている場合:

>>> s=difflib.SequenceMatcher(lambda x: x in ' \n', s1, s2)
>>> s.ratio()
0.7653142402545744

新しい行はスペースよりもはるかに大きな影響を与えているようです.

于 2008-09-29T06:43:27.987 に答える
1

私は Difflib.SequenceMatcher を使用していませんが、ファイルを前処理してすべての空白行と空白を削除し (おそらく正規表現を介して)、比較を行うことを検討しましたか?

于 2008-09-29T03:47:19.673 に答える