算法在数据语料库中检测重复/相似的字符串——比如电子邮件主题,在 Python [重复]
Posted
技术标签:
【中文标题】算法在数据语料库中检测重复/相似的字符串——比如电子邮件主题,在 Python [重复]【英文标题】:Algorithm detect repeating/similiar strings in a corpus of data -- say email subjects, in Python [duplicate] 【发布时间】:2011-02-14 16:08:40 【问题描述】:我正在下载我的电子邮件主题行的长列表,目的是查找我多年前加入的电子邮件列表,并希望从我的 Gmail 帐户中清除它们(这变得非常缓慢。)
我特别想到了经常来自同一地址的新闻通讯,并在主题中重复产品/服务/组的名称。
我知道我可以根据来自特定电子邮件地址的项目的常见情况进行搜索/排序(我打算这样做),但我想将该数据与重复的主题行关联起来......
现在,许多主题行会导致字符串匹配失败,但是 “谷歌好友:我们的最新消息” “谷歌朋友:我们今天在做什么” 比随机主题行更相似,如下所示: “维珍航空今天大甩卖” “搭乘维珍航空的航班”
那么——我怎样才能开始自动提取可能更相似的字符串的趋势/示例。
我考虑过并放弃的方法('因为必须有更好的方法'):
提取所有可能的子字符串并按照它们出现的频率对其进行排序,然后手动选择相关的子字符串 去掉第一个或两个单词,然后计算每个子字符串的出现次数 比较条目之间的 Levenshtein 距离 某种字符串相似度索引...其中大部分因效率低下或可能需要大量人工干预而被拒绝。我想我需要某种模糊字符串匹配..?
最后,我可以想出一些笨拙的方法来做这件事,但我正在寻找更通用的东西,所以我添加到我的工具集而不是这个数据集的特殊外壳。
在此之后,我会将特定主题字符串的出现与“发件人”地址进行匹配 - 我不确定是否有一种构建数据结构的好方法,该数据结构表示两条消息是“相同的电子邮件列表”或通过将我所有的电子邮件主题/来自地址过滤到可能的“相关”电子邮件池中而不是 - 但这是在此之后要解决的问题。
任何指导将不胜感激。
【问题讨论】:
你要找的词是en.wikipedia.org/wiki/…>。 我发现这个 SO question 也提出了一些更知名的算法。 ***.com/questions/653157/… 【参考方案1】:平滑的 BLEU
您也许可以利用科目之间的 smooth-BLEU 分数。 BLEU 是一种评估指标,用于评估机器翻译系统产生的翻译与人类产生的翻译的相似程度。平滑 BLEU 的计算方式与普通 BLEU 分数类似,不同之处在于您将 n-gram 匹配计数加一,以便在评估短文本段时避免将任何内容乘以零。
Smooth-BLEU 的计算速度应该比 Levenshtein 距离更快,同时仍然捕获词序信息,因为它会查看 n-gram 匹配,而不仅仅是匹配在单个单词之间。
不幸的是,我没有指向 Python BLEU 实现的指针,但您会从 NIST here 找到一个 Perl 实现。
【讨论】:
【参考方案2】:我会首先将每个字符串转换为一组或多组单词(忽略标点符号和小写/大写的差异)。 (如果这还不够强大,在第二遍中,我可以尝试成对甚至是三个相邻的单词,称为二元组和三元组)。如此减少的字符串之间相似性的关键衡量标准是,总体上不高频率的单词(不是the
、and
等;-)对于两个字符串来说都是通用的,所以一个简单的集合交集(或多集交集,但对于您的简单用例,我认为只有集可以正常工作,尤其是二元组)应该足以衡量“共性”。两个字符串共有的单词越稀有,它的价值就越高,因此整个语料库中单词频率的负对数是这个启发式的一个很好的起点。
【讨论】:
这是一个有趣的方法 - 一个问题:我这个项目的一个目标是学习已经存在的算法,而不是为这个问题编写我自己的算法,以便我更好地理解的问题空间。这感觉像是一种特定的“对这种情况有好处”类型的方法,而不是“这是一个常用的工具”,我有点害怕计算强度。 (话又说回来,这仍然是迄今为止我得到的最佳答案,非常感谢!) @RizwanK,处理单词流(通常有些标准化,例如 wrt 大小写)而不是字符流是信息检索中非常常见的方法(而不是“工具”;-),并且设置或多组(单词、二元组、三元组)绝非罕见。如果你正在寻找现有的 Python 代码来帮助解决这个问题,你可能会在 NLTK 中找到一些东西,尽管我不确定。但是我绝对不是只针对您的特定问题而即时发明数据管理方法;-)。如果有的话,在 IR 中处理的通常“文档”的电子邮件主题的简短应该减少计算负载! “但我绝对不是为了你的特定问题而即时发明数据管理方法” grin 公平点。您知道您建议的方法是否有名称?谢谢! @Rizwank,我不确定是否有“将字符串转换为单词字符串”的特定名称,等等。以上是关于算法在数据语料库中检测重复/相似的字符串——比如电子邮件主题,在 Python [重复]的主要内容,如果未能解决你的问题,请参考以下文章
ElasticSearch实战-TF/IDF/BM25分值计算(文本搜索排序分值计算,全文检索算法,文本相似度算法)