【问题标题】:Find the most similar terms from a list of given terms in a huge text corpora [closed]从庞大的文本语料库中的给定术语列表中查找最相似的术语[关闭]
【发布时间】:2021-12-15 06:19:20
【问题描述】:

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

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

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

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

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

我的问题: 问题是,上述策略实际上是有效的。但是,对于整个语料库来说,这样做太慢了。另外,我的名单太长了。谁能建议一个更快的算法/数据结构来比较如此庞大的语料库中的这么多名字?这里有任何基于深度学习的方法吗?比如我可以在 200 万个 Podcast 名称上训练 LSTM。那么,只要遇到可能的名称,这个经过训练的模型就可以从我们的列表中输出最接近任何 Podcast 的拼写?

【问题讨论】:

标签: machine-learning deep-learning nlp string-matching


【解决方案1】:

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

如果需要模糊匹配(当播客名称的提及文本不完全匹配时也匹配),那么如果每个查询文档操作提供足够的,则考虑使用模糊字符串匹配库,如 thefuzz(又名fuzzywuzzy)表现。另一种方法是从子字符串中预先计算 n-gram,并像 fuzzyset 包那样为每个文档累积所有 n-gram 的支持计数。

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

【讨论】:

  • 非常感谢您的意见,@grov。是的! “模糊匹配”是我想传达的想法,但我不知道这个词。正如我所说,difflib 库在识别最接近的单词方面非常准确。但是,我担心的是时间效率。每次我必须迭代超过 200 万个名称来识别 subreddit 中的单个事件。是否有一种数据结构可以使这种单词访问更快?还是有更快的方法?
  • 嗨@Shivram,我编辑了答案以包含对fuzzyset 包的引用。我还发现 this stackoverflow discussion 很有帮助。
【解决方案2】:

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

This article 给出了更详细的过程描述和一些有用的库的链接。 You should also read 这篇文章描述了一个与您的项目有些相似的项目,并包含有关提高性能的信息。我将在这里描述我所理解的方法。

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

如果您可以计算“文档”(或文本子集)的 tf-idf,则可以将文本子集转换为 tf-idf 值向量。一旦你有了这个向量,你就可以用它来计算你的文本子集与其他子集的余弦相似度。比如说,找出 reddit 的摘录与你所有的标题的相似之处。 (有一种方法可以管理这个问题,这样您就不必不断地检查每个 reddit 摘录与每个标题 - see this post)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多