从庞大的文本语料库中的给定术语列表中找到最相似的术语

Find the most similar terms from a list of given terms in a huge text corpora

我有一个 200 万长的播客名称列表。此外,我从子 Reddit(帖子、评论、线程等)中收集了大量文本语料库,用户经常提到我们列表中的播客。我要解决的任务是,我必须计算语料库中每个名字的提及次数。换句话说,生成 (name: count) 对的字典。

这里的挑战是这些播客名称中的大多数都是几个词长,例如:“犹他州的中午新闻”; “Congress Hears Tech Policy Debates”等。然而,Reddit 用户提及的内容通常是原始名称的粗略子串,例如:“Utah Noon/Utah New”或“Congress Tech Debates/Congress Hears Tech”。这使得从列表中识别名称变得非常困难。

我尝试过的: 首先,我处理并将原始播客名称中的所有单词连接成一个单词。例如, “国会听取技术政策辩论”->“Congresshearstechpolicydebates”

当我遍历 subreddit 语料库时,每当我发现一个命名实体或一个潜在的播客名称时,我就这样处理它的词,
"Congress Hears Tech"(假设这是我在语料库中找到的内容)-> "congresshearstech"

我将这个“congressshearstech”字符串与播客列表中所有已处理的名称进行了比较。我使用根据单词拼写相似度计算的得分进行比较。我使用 difflib Python 库做到了这一点。此外,还有像 Leveshtein 和 Hamming Distance 这样的相似度分数。最终,我将与我们在语料库中找到的字符串的相似度得分最高的播客名称作为奖励。

我的问题: 问题是,上述策略实际上是有效的。然而,它对整个语料库来说太慢了。另外,我的名单太长了。任何人都可以建议一个更快的 algorithm/data 结构来比较如此庞大的语料库中的这么多名字吗?这里有可能有任何基于深度学习的方法吗?比如我可以在 200 万个播客名称上训练 LSTM。因此,无论何时遇到可能的名称,这个经过训练的模型都可以从我们的列表中输出最接近任何 Podcast 的拼写?

如果精确的文本匹配(有或没有你的空格去除预处理)就足够了,考虑 Aho-Corasick 字符串匹配算法来检测文本正文(即 subreddit 内容)中的子字符串匹配(即播客名称) . python 这个算法有很多实现,但是 ahocorapy 有一个很好的自述文件总结了如何在数据集上使用它。

如果需要模糊匹配(当播客名称的提及文本不是完全匹配时也匹配),然后考虑像 thefuzz (aka fuzzywuzzy) if per query-document operations offer sufficient performance. Another approach is to precompute n-grams from the substrings and accumulate the support counts across all n-grams for each document as the fuzzyset 包那样的模糊字符串匹配库。

如果知识​​库中提供了有关播客的其他信息(即不仅仅是名称已知),那么问题更像是实体链接的一般 NLP 任务,而是针对自定义知识库(即播客列表)。这是一个活跃的研究领域,最先进的方法在 NLP Progress here.

上进行了讨论

您也许可以使用 tf-idf 和余弦相似度之类的东西来解决这个问题。我不熟悉任何在这里有用的机器学习使用方法。

This article gives a more detailed description of the process and links to some useful libraries. You should also read 这篇文章描述了一个与您的项目有些相似的项目,并包含有关提高性能的信息。我将在这里描述我所理解的方法。

tf-idf是一个首字母缩写词,意思是“词频逆文档频率”。本质上,您查看文本的一个子集,并找到您的子集中术语相对于整个文本语料库中这些术语的频率的频率。在您的子集中和整个语料库中常见的术语将具有低值,而在您的子集中常见但在语料库中不常见的术语将具有高值。

如果您可以计算“文档”(或文本子集)的 tf-idf,则可以将文本子集转换为 tf-idf 值的向量。一旦你有了这个向量,你就可以用它来计算你的文本子集与其他子集的 cosine-similarity 。比方说,找到 reddit 的摘录与你所有标题的相似性。 (有一种方法可以解决这个问题,这样您就不会连续检查每个 reddit 摘录与每个标题的字面意思 - see this post)。

一旦你可以做到这一点,那么我认为解决方案是选择一些值 n,并一次扫描 reddit 帖子 n 个单词,对你的标题进行 tf-idf / 余弦相似度扫描并标记匹配当 cosine-similarity 高于某个值时(您需要对此进行试验以找到能给您带来良好结果的因素)。然后,递减 n 并重复直到 n 为 0。