Python对数据集中的相似记录(字符串)进行分组
Posted
技术标签:
【中文标题】Python对数据集中的相似记录(字符串)进行分组【英文标题】:Python group similar records (strings) in dataset 【发布时间】:2018-11-27 19:52:35 【问题描述】:我有一个这样的输入表:
In [182]: data_set
Out[182]:
name ID
0 *** 123
1 stikoverflow 322
2 stack, overflow 411
3 internet.com 531
4 internet 112
5 football 001
我想根据fuzzywuzzy 对相似的字符串进行分组。因此,在应用模糊匹配后,所有具有超过某个相似度阈值(如 > %90 相似度)的字符串将组合在一起。所以期望的输出是:
In [182]: output
Out[182]:
name ID group
0 *** 123 1
1 stikoverflow 322 1
2 stack, overflow 411 1
3 internet.com 531 2
4 internet 112 2
5 football 001 3
我正在搜索不同的主题,我发现 this 和 this 只是名称匹配而不是进行聚类。另外this 仅显示了对我没有帮助的最佳匹配。这个page也是在解释k-means聚类,需要预先设置聚类的数量,在这种情况下是不实用的。
更新:
我发现fuzzywuzzy
包中的process
方法可以在一定程度上解决我的问题。但是这个方法只比较字符串和列表,而不是列表:
from fuzzywuzzy import process
with open("data-set.txt", "r") as f:
data = f.read().split("\n")
process.extract("***",data, limit=3)
输出:
[('***', 100), ('stack, overflow', 93), ('stikoverflow', 88)]
但是还是不知道怎么用它来集群。
【问题讨论】:
这不是集群问题。它与拼写更正更密切相关。对于无监督方法,狗和雾非常接近。小狗和雾也很近。但是狗和狗的区别要大得多。所以不要使用任何无人监督的东西! 我相信在某些时候我们可以将其视为一个聚类问题,因为我们有一个相似性函数,并且相似的字符串是根据某个阈值组合在一起的,对吗? 我给出的例子是这个假设的反例。你没有足够好的相似度函数。使用有监督的东西。 我猜我使用的任何功能,无论如何我都会有一些误报。我想将它应用于数百万条记录。最终用户将在最后对其进行评估。我只想给他们一组类似的记录,他们可以从中选择他们想要的东西。你推荐什么相似度函数? 无。我知道没有一个会起作用。人们可能会建议 Levenshtein,但那个真的不会很好用。自己试试吧。 【参考方案1】:这可以使用string-grouper
来完成:
from string_grouper import group_similar_strings
group_similar_strings(data_set['name'])
string-grouper
【讨论】:
以上是关于Python对数据集中的相似记录(字符串)进行分组的主要内容,如果未能解决你的问题,请参考以下文章