0

データフレームsample_df (4 列: paper_idtitleabstractbody_text ) を取得します。アブストラクト カラム (アブストラクトごとに ~ 1000 ワード) を抽出し、テキスト クリーニング プロセスを適用しました。これが私の質問です:

私の目標は tf -idf 質問応答を行うことであるため、質問と要約の間のコサイン類似度の計算が終了したら、対応する情報 ( paper_idtitlebody_text など) を含む上位 5 つの記事スコアを返すにはどうすればよいでしょうか。

私の英語が下手で、nlp を初めて使用したことを本当に申し訳ありません。誰かが助けてくれれば幸いです。

from sklearn.metrics.pairwise import linear_kernel
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.metrics.pairwise import cosine_similarity  

txt_cleaned = get_cleaned_text(sample_df,sample_df['abstract'])
question = ['Can covid19 transmit through air']

tfidf_vector = TfidfVectorizer()

tfidf = tfidf_vector.fit_transform(txt_cleaned)

tfidf_question = tfidf_vector.transform(question)
cosine_similarities = linear_kernel(tfidf_question,tfidf).flatten()

related_docs_indices = cosine_similarities.argsort()[:-5:-1]
cosine_similarities[related_docs_indices]

#output([0.18986527, 0.18339485, 0.14951123, 0.13441914]) 
4

1 に答える 1

0

最初: 5 つの記事が必要な[:-5:-1]場合は、代わりに使用する必要があります[:-6:-1]。負の値の場合はほとんど変わらないためです。

または使用[::-1][:5]-[::-1]すべての値を逆にしてから、通常を使用できます[:5]


取得したら、要素を取得するためにrelated_docs_indices使用できます.iloc[]DataFrame

 sample_df.iloc[ related_docs_indices ]

同じ類似性を持つ要素がある場合は、それらを逆の順序で提供します。


ところで:

similaritiesに追加することもできますDataFrame

sample_df['similarity'] = cosine_similarities

並べ替え(逆順)して5つのアイテムを取得します。

sample_df.sort_values('similarity', ascending=False)[:5]

同じ類似性を持つ要素がある場合、それらは元の順序で提供されます。


いくつかのデータを含む最小限の作業コード - 誰でもコピーしてテストできます。

要素が 5 つしかないDataFrameので、2 つの要素を検索します。

from sklearn.metrics.pairwise import linear_kernel
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.metrics.pairwise import cosine_similarity  

import pandas as pd

sample_df = pd.DataFrame({
    'paper_id': [1, 2, 3, 4, 5],
    'title': ['Covid19', 'Flu', 'Cancer', 'Covid19 Again', 'New Air Conditioners'],
    'abstract': ['covid19', 'flu', 'cancer', 'covid19', 'air conditioner'],
    'body_text': ['Hello covid19', 'Hello flu', 'Hello cancer', 'Hello covid19 again', 'Buy new air conditioner'],
})

def get_cleaned_text(df, row):
    return row

txt_cleaned = get_cleaned_text(sample_df, sample_df['abstract'])
question = ['Can covid19 transmit through air']

tfidf_vector = TfidfVectorizer()

tfidf = tfidf_vector.fit_transform(txt_cleaned)

tfidf_question = tfidf_vector.transform(question)
cosine_similarities = linear_kernel(tfidf_question,tfidf).flatten()

sample_df['similarity'] = cosine_similarities

number = 2
#related_docs_indices = cosine_similarities.argsort()[:-(number+1):-1]
related_docs_indices = cosine_similarities.argsort()[::-1][:number]

print('index:', related_docs_indices)

print('similarity:', cosine_similarities[related_docs_indices])

print('\n--- related_docs_indices ---\n')

print(sample_df.iloc[related_docs_indices])

print('\n--- sort_values ---\n')

print( sample_df.sort_values('similarity', ascending=False)[:number] )

結果:

index: [3 0]
similarity: [0.62791376 0.62791376]

--- related_docs_indices ---

   paper_id          title abstract            body_text  similarity
3         4  Covid19 Again  covid19  Hello covid19 again    0.627914
0         1        Covid19  covid19        Hello covid19    0.627914

--- sort_values ---

   paper_id          title abstract            body_text  similarity
0         1        Covid19  covid19        Hello covid19    0.627914
3         4  Covid19 Again  covid19  Hello covid19 again    0.627914
于 2020-08-17T13:59:22.683 に答える