78

私が完成させようとしているのは、ファイルを読み込み、各文を元の文に従って比較するプログラムです。元の文と完全に一致する文は 1 のスコアを受け取り、完全に反対の文は 0 を受け取ります。その他のあいまいな文はすべて、1 から 0 の間のグレードを受け取ります。

Python 3 でこれを完了するには、どの操作を使用すればよいかわかりません。

テキスト 1 がオリジナルで、先行する他の文字列が比較対象であるサンプル テキストを含めました。

テキスト: サンプル

テキスト 1: 暗く嵐の夜でした。私は一人で赤い椅子に座っていました。私は3匹の猫を飼っていたので、完全に一人ではありませんでした。

テキスト 20: 暗く嵐の夜でした。私は真っ赤な椅子に一人で座っていました。私は 3 匹の猫を飼っていたので、完全に一人ではありませんでした // 高得点を獲得する必要がありますが、1 点ではありません

テキスト 21: 暗くて嵐のような夜でした。私は真っ赤なカテドラに一人で座っていました。私は3匹の猫を飼っていたので、完全に一人ではありませんでした//テキスト20よりも低いスコアにする必要があります

テキスト 22: 私は真っ赤な大聖堂に一人で座っていました。私は3匹の猫を飼っていたので、完全に一人ではありませんでした。暗くて嵐のような夜でした。// スコアはテキスト 21 より低くなければなりませんが、0 ではありません

テキスト 24: 暗い嵐の夜でした。私は一人ではありませんでした。私は赤い椅子に座っていませんでした。私は3匹の猫を飼っていました。// スコアは 0 でなければなりません!

4

5 に答える 5

92

difflib標準ライブラリには、文字列を比較し、類似性に基づいてスコアを返すことができるモジュール ( と呼ばれる) があります。クラスはあなたが望むことをするSequenceMatcherべきです。

Python プロンプトからの小さな例:

>>> from difflib import SequenceMatcher as SM
>>> s1 = ' It was a dark and stormy night. I was all alone sitting on a red chair. I was not completely alone as I had three cats.'
>>> s2 = ' It was a murky and stormy night. I was all alone sitting on a crimson chair. I was not completely alone as I had three felines.'
>>> SM(None, s1, s2).ratio()
0.9112903225806451
于 2012-04-30T12:13:28.407 に答える
17

fuzzysetインデックス作成と検索の両方でfuzzywuzzy( )よりもはるかに高速です。difflib

from fuzzyset import FuzzySet
corpus = """It was a murky and stormy night. I was all alone sitting on a crimson chair. I was not completely alone as I had three felines
    It was a murky and tempestuous night. I was all alone sitting on a crimson cathedra. I was not completely alone as I had three felines
    I was all alone sitting on a crimson cathedra. I was not completely alone as I had three felines. It was a murky and tempestuous night.
    It was a dark and stormy night. I was not alone. I was not sitting on a red chair. I had three cats."""
corpus = [line.lstrip() for line in corpus.split("\n")]
fs = FuzzySet(corpus)
query = "It was a dark and stormy night. I was all alone sitting on a red chair. I was not completely alone as I had three cats."
fs.get(query)
# [(0.873015873015873, 'It was a murky and stormy night. I was all alone sitting on a crimson chair. I was not completely alone as I had three felines')]

警告: ファジーセットに混ぜないように注意unicodebytesてください。

于 2016-07-11T21:19:18.733 に答える
9

このタスクは言い換え識別と呼ばれ、自然言語処理の活発な研究分野です。いくつかの最先端の論文をリンクしました。その多くは GitHub でオープン ソース コードを見つけることができます。

回答されたすべての質問は、2 つの文の間に何らかの文字列/表面の類似性があることを前提としていますが、実際には文字列の類似性がほとんどない 2 つの文は意味的に類似している可能性があることに注意してください。

そのような類似性に興味がある場合は、 Skip-Thoughtsを使用できます。GitHub ガイドに従ってソフトウェアをインストールし、readme の言い換え検出セクションに移動します。

import skipthoughts
model = skipthoughts.load_model()
vectors = skipthoughts.encode(model, X_sentences)

これにより、文 (X_sentences) がベクトルに変換されます。後で、次の方法で 2 つのベクトルの類似性を見つけることができます。

similarity = 1 - scipy.spatial.distance.cosine(vectors[0], vectors[1])

ここで、vector[0] と vector 1は、スコアを求めたいX_sentences[0]、X_sentences 1に対応するベクトルであると想定しています。

文をベクトルに変換するモデルは他にもあり、ここで見つけることができます。

文をベクトルに変換すると、それらのベクトル間のコサインの類似性を見つけるだけで類似性が決まります。

2020年更新Tensorflowと呼ばれる深層学習フレームワークに基づいて、GoogleがリリースしたBERT と呼ばれるこの新しいモデルがあります。Transformersと呼ばれる、多くの人が使いやすい実装もあります。. これらのプログラムが行うことは、2 つの句または文を受け入れ、これらの 2 つの句または文が同じかどうかを判断するように訓練することができるということです。それらをトレーニングするには、ラベルが 1 または 0 の文がいくつか必要です (意味が同じかどうかに関係なく)。トレーニング データ (既にラベル付けされたデータ) を使用してこれらのモデルをトレーニングすると、トレーニング済みのモデルを使用して、フレーズ/文の新しいペアを予測できるようになります。これらのモデルをトレーニングする (微調整と呼びます) 方法は、対応する github ページや、このなどの他の多くの場所で見つけることができます。

また、MRPC (microsoft paraphrase identification corpus) と呼ばれる英語で利用可能な、ラベル付けされたトレーニング データも既に存在します。BERT の多言語または言語固有のバージョンも存在するため、このモデルを他の言語でも拡張 (たとえばトレーニング) できることに注意してください。

于 2016-11-23T02:40:05.810 に答える