Spacy-将相似性功能应用于熊猫行中的文档

时间:2019-11-29 00:17:36

标签: python pandas spacy

我对熊猫系列(按行)中存储的文档的相似性()操作有疑问。我标记并从文档中提取了所有名词,然后将它们作为“标记”列表传递给另一列。现在,我想计算它们之间的相似度。但是,我对类型有问题(肯定是对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比较向量空间,这意味着它找到与相似性得分相关的上下文(在许多不同上下文中反复接近同一单词的单词)。在我的模型中,没有上下文,只有独立的单词进行比较(我打算以某种方式对这个相似度分数求平均值,因为我希望名词,动词和整个文档的相似度分数很少)。

有指针吗?

1 个答案:

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