python – 用于pandas DataFrame中文本的Jaccard相似度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 用于pandas DataFrame中文本的Jaccard相似度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3115字,纯文字阅读大概需要5分钟。
内容图文
![python – 用于pandas DataFrame中文本的Jaccard相似度](/upload/InfoBanner/zyjiaocheng/782/f54a7df7700746d1a1399f14f59c4985.jpg)
我想测量pandas DataFrame中文本之间的jaccard相似度.
更确切地说,我有一些实体组,并且在一段时间内每个实体都有一些文本.我想分析每个实体的文本相似度(这里是Jaccard相似度)随时间的变化.
一个简单的例子来说明我的观点:
import pandas as pd
entries = [
{'Entity_Id':'Firm1', 'date':'2001-02-05', 'text': 'This is a text'},
{'Entity_Id':'Firm1', 'date':'2001-03-07', 'text': 'This is a text'},
{'Entity_Id':'Firm1', 'date':'2003-01-04', 'text': 'No similarity'},
{'Entity_Id':'Firm1', 'date':'2007-10-12', 'text': 'Some similarity'},
{'Entity_Id':'Firm2', 'date':'2001-10-10', 'text': 'Another firm'},
{'Entity_Id':'Firm2', 'date':'2005-12-03', 'text': 'Another year'},
{'Entity_Id':'Firm3', 'date':'2002-05-05', 'text': 'Something different'}
]
df = pd.DataFrame(entries)
Entity_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'
我想要的输出将是这样的:
Entity_Id日期文本Jaccard
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中输入了NaN的原始文本,稍后将其删除 – >需要用于整列的标记化)
df = df.sort_values(['Entity_Id', 'date'], ascending=True)
df['text_shifted'] = df.groupby(['Entity_Id'])['text'].shift(1)
df['IsNaN'] = df['text_shifted'].isnull().astype(int)
df['text_shifted'] = df['text_shifted'].fillna(df['text'])
在下面我使用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个单词,并且我有大约10万个文本.
有什么方法可以加快这个过程吗?我可以避免标记化还是更好地使用sklearn来计算相似度?
如果我使用这里建议的余弦相似度:Cosine Similarity row-wise我很快就得到了我的结果.但我坚持用jaccard做这件事.
解决方法:
加速该过程的一种方法可以是使用Pandas on Ray的并行处理.
您可以尝试使用jaccard_distance的NLTK实现jaccard相似性.我找不到处理时间的任何显着改进(用于计算相似度),可能在更大的数据集上更好地工作.
尝试将NLTK实现与您的自定义jaccard相似度函数进行比较(平均长度为4个字/令牌的200个文本样本)
NTLK jaccard_distance:
CPU times: user 3.3 s, sys: 30.3 ms, total: 3.34 s
Wall time: 3.38 s
自定义jaccard相似性实现:
CPU times: user 3.67 s, sys: 19.2 ms, total: 3.69 s
Wall time: 3.71 s
内容总结
以上是互联网集市为您收集整理的python – 用于pandas DataFrame中文本的Jaccard相似度全部内容,希望文章能够帮你解决python – 用于pandas DataFrame中文本的Jaccard相似度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。