Python 数据帧中文本的Jaccard相似性

Python 数据帧中文本的Jaccard相似性,python,pandas,scikit-learn,similarity,sklearn-pandas,Python,Pandas,Scikit Learn,Similarity,Sklearn Pandas,我想测量数据帧中文本之间的jaccard相似性。 更准确地说,我有一些实体组,每个实体在一段时间内都有一些文本。我想分析一段时间内的文本相似性(这里是Jaccard相似性),分别针对每个实体 举一个简单的例子来说明我的观点: 实体Id日期文本 Firm1 2001-02-05 'This is a text' Firm1 2001-03-07 'This is a text' Firm1 2003-01-04 'No similarity' Firm1 2007-

我想测量数据帧中文本之间的jaccard相似性。 更准确地说,我有一些实体组,每个实体在一段时间内都有一些文本。我想分析一段时间内的文本相似性(这里是Jaccard相似性),分别针对每个实体

举一个简单的例子来说明我的观点:


实体Id日期文本

Firm1   2001-02-05   'This is a text' 
Firm1   2001-03-07   'This is a text'
Firm1   2003-01-04   'No similarity'
Firm1   2007-10-12   'Some similarity'
Firm2   2001-10-10   'Another firm'
Firm2   2005-12-03   'Another year'
Firm3   2002-05-05   'Something different'

我想要的输出是这样的:

实体Id日期文本卡

Firm1   2001-02-05   'This is a text'       NaN
Firm1   2001-03-07   'This is a text'       1
Firm1   2003-01-04   'No similarity'        0
Firm1   2007-10-12   'Some similarity'      0.33
Firm2   2001-10-10   'Another firm'         NaN 
Firm2   2005-12-03   'Another year'         0.33  
Firm3   2002-05-05   'Something different'  NaN 

也就是说,我喜欢比较一组公司中的所有文本元素,而不管文本之间的时间间隔。我想总是把它和前面的文本进行比较。因此,每个公司的第一个条目总是空的,因为没有文本可供比较

我的方法是按实体标识符将文本移动一个时间间隔(下一个日期可用)。然后确定每个实体的第一份报告,并标记该报告。(我在text_shifted中输入NaNs的原始文本,稍后将其删除->需要它来标记整个列)

在下文中,我使用jaccard相似性,如下所示:

def jaccard_similarity(query, document):
    intersection = set(query).intersection(set(document))
    union = set(query).union(set(document))
    return len(intersection)/len(union)
但是,我必须首先标记输入。 但如果我这样做:

import nltk
df['text_tokens'] = df.text.apply(nltk.word_tokenize)
df['shift_tokens'] = df.text_shifted.apply(nltk.word_tokenize)
在一个非简化文本示例中,需要几年的时间来标记文本,其中每个文本大约有5000个单词,我有大约100000个文本

有什么办法可以加快这个过程吗?我是否可以避免标记化,或者更好地使用sklearn来计算相似度


如果我像这里建议的那样使用余弦相似性:我很快就能得到结果。但是我一直在用jaccard来做这件事。

一种加速过程的方法是使用并行处理

您可以尝试针对jaccard相似性的NLTK实现。我没有发现在处理时间上有任何显著的改进(用于计算相似度),但在更大的数据集上可能效果更好

尝试将NLTK实现与自定义jaccard相似性函数进行比较(在平均长度为4个单词/标记的200个文本样本上)

NTLK jaccard_距离:

CPU times: user 3.3 s, sys: 30.3 ms, total: 3.34 s
Wall time: 3.38 s
自定义卡相似性实现:

CPU times: user 3.67 s, sys: 19.2 ms, total: 3.69 s
Wall time: 3.71 s

你试过介绍你的工作吗?基本上,标记化似乎是瓶颈
CPU times: user 3.3 s, sys: 30.3 ms, total: 3.34 s
Wall time: 3.38 s
CPU times: user 3.67 s, sys: 19.2 ms, total: 3.69 s
Wall time: 3.71 s