0

我得到一个数据框sample_df(4 列:paper_idtitleabstractbody_text)。我提取了摘要列(每个摘要约 1000 个字)并应用了文本清理过程。这是我的问题:

在计算完问题和摘要之间的余弦相似度后,由于我的目标是做 tf -idf 问答,它如何返回带有相应信息(例如paper_idtitlebody_text )的 top5 文章分数。

我真的很抱歉我的英语很差而且我是 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 ]

如果您将拥有具有相同相似性的元素,那么它将以相反的顺序给出它们。


顺便提一句:

您还可以添加similaritiesDataFrame

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 回答