我对熊猫系列(按行)中存储的文档的相似性()操作有疑问。我标记并从文档中提取了所有名词,然后将它们作为“标记”列表传递给另一列。现在,我想计算它们之间的相似度。但是,我对类型有问题(肯定是对spacy流水线的某种误解)。我现在有这样的东西:
编辑:
我从这里获得名词列表:
def nouns_verbs(title_text):
token_nouns = []
token_verb = []
title_text = nlp(title_text)
for token in title_text:
if token.pos_ == 'NOUN':
token_nouns.append(token)
elif token.pos_ == 'VERB':
token_verb.append(token)
return title_text, token_nouns, token_verb
new_df = df.ggg.apply(nouns_verbs)
df = pd.DataFrame([x for x in new_df], columns=['title', 'nouns', 'verbs'])
df.nouns的示例(请记住,这是令牌列表,而不是str):
0 [shipping, inc, time, charter, contract]
1 [telensa, lighting, solution, kingdom, ports]
2 [pioneer, export, gulf, coast, cfo]
For循环查找row_first中的名词与row_second中的名词之间的相似性
for row_first, row_second in itertools.combinations(df.nouns, 2):
n1 = [nlp(x.text) for x in row_first]
n2 = [nlp(x.text) for x in row_second]
sim = n1.similarity(n2)
print('N1:', n1, 'N2:', n2, 'SIM', sim)
这抱怨:
AttributeError: 'list' object has no attribute 'similarity'
我应该如何构造循环以比较row_first中的每个名词和row_second中的每个名词?如果我像这样遍历令牌
[nlp(x.text) for x in row_first for x in x]
我仍然收到TypeError TypeError: 'spacy.tokens.token.Token' object is not iterable
。但是,即使-我想逐行比较,而不是逐个令牌比较。
接下来的问题是:为了相似起见,将名词与类似名词进行比较是否有意义?据我了解,word2vec比较向量空间,这意味着它找到与相似性得分相关的上下文(在许多不同上下文中反复接近同一单词的单词)。在我的模型中,没有上下文,只有独立的单词进行比较(我打算以某种方式对这个相似度分数求平均值,因为我希望名词,动词和整个文档的相似度分数很少)。
有指针吗?
答案 0 :(得分:0)
import pandas as pd
df = pd.DataFrame(['i love playing football','good morning how are you'], columns = ['text'])
df['token'] = df['text'].apply(lambda x: nlp(x))
为相似起见,您的值应为spacy.tokens.doc.Doc,而不是列出出现错误的原因。我认为您可能使用了不同的令牌生成器,这给了您列表。 现在,您只需加入列表令牌,然后将该字符串传递到spacy nlp模型中,这将为您提供计算相似度所需的类型
print(type(df['token'][0]))
spacy.tokens.doc.Doc
sim = df['token'][0].similarity(df['token'][1])
#op
0.67807547218049