最近作成したNY-Timesコーパスでドキュメントの重複排除を試しています。金融詐欺に関連するデータが含まれています。
まず、記事のスニペットをTaggedDocument
オブジェクトのリストに変換します。
nlp = spacy.load("en_core_web_sm")
def create_tagged_doc(doc, nlp):
toks = nlp(doc)
lemmatized_toks = [tok.lemma_ for tok in toks if not tok.is_stop]
return lemmatized_toks
df_fraud = pd.read_csv('...local_path...')
df_fraud_list = df_fraud['snippet'].to_list()
documents = [TaggedDocument(create_tagged_doc(doc, nlp), [i]) for i, doc in enumerate(df_fraud_list)]
サンプルTaggedDocument
は次のようになります。
TaggedDocument(words=['Chicago', 'woman', 'fall', 'mortgage', 'payment',
'victim', 'common', 'fraud', 'know', 'equity', 'strip', '.'], tags=[1])
次に、Doc2Vecモデルをコンパイルしてトレーニングします。
cores = multiprocessing.cpu_count()
model_dbow = Doc2Vec(dm=0, vector_size=100, negative=5, hs=0, min_count=2, sample = 0, workers=cores)
model_dbow.build_vocab(documents)
model_dbow.train(documents,
total_examples=model_dbow.corpus_count,
epochs=model_dbow.epochs)
コサイン類似度を定義しましょう:
cosine_sim = lambda x, y: np.inner(x, y) / (norm(x) * norm(y))
さて、問題は、ほぼ類似している2つの文を定義し、それらのコサイン類似性スコアを取得すると、非常に低くなることです。例えば
a = model_dbow.infer_vector(create_tagged_doc('That was a fradulent transaction.', nlp))
b = model_dbow.infer_vector(create_tagged_doc('That transaction was fradulant.', nlp))
print(cosine_sim(a, b)) # 0.07102317
念のため、まったく同じベクトルを繰り返して確認しましたが、これは適切です。
a = model_dbow.infer_vector(create_tagged_doc('That was a fradulent transaction.', nlp))
b = model_dbow.infer_vector(create_tagged_doc('That was a fradulent transaction.', nlp))
print(cosine_sim(a, b)) # 0.9980062
ここで何が問題になっていますか?
エポック数の問題のようです。エポック数を指定せずにDoc2Vecインスタンスを作成する場合、たとえばmodel_dbow = Doc2Vec(dm=0, vector_size=100, negative=5, hs=0, min_count=2, sample = 0, workers=cores)
、デフォルトでは5に設定されています。どうやらそれは私のコーパスにとって十分ではありませんでした。エポックを50に設定し、モデルを再トレーニングしました。機能した。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加