【问题标题】:How to find text reuse with fuzzy match?如何通过模糊匹配找到文本重用?
【发布时间】:2021-03-22 14:21:14
【问题描述】:

我试图有效地找到一个短语和一个大型语料库之间的相似性。例如,假设我的语料库是书 Moby Dick。这本书有几万字。

除此之外,我还有一些简短的短语。例如:

phrase1 = "Call me Ishmael" # This is the first sentence in the book exactly.
phrase2 = "Call me Isabel" # This is like the previous with changes of few letters from the third word.
phrase3 =  "Call me Is mael" #It's a similar sentence but one word split in two.

除此之外,我当然还有很多其他的句子和书中的句子不相似。

我想知道识别与书中句子相似的句子的通用且有效的方法是什么。

我尝试过哪些对我来说似乎不太合适的事情?

  • 我将所有输入句子分成 3/4/5/6 个 n-gram。
  • 我将所有语料库句子分成 3/4/5/6 个 n-gram。
  • 然后我尝试在语料库 n-gram 和输入 n-gram 的所有可能组合之间找到近似匹配(使用 FuzzySet)(即使是单词拆分或合并的情况,也需要这些组合。)李>

我很清楚,这种方法非常浪费,而且可能也不是最适合我的需要。我很想知道如何最好地做到这一点。

【问题讨论】:

  • 也许你可以使用字符串编辑距离算法。一种非常低效的方法是计算到给定长度的文本的所有子字符串的字符串编辑距离(例如输入字符串的大小)
  • @Stefan 所有非空子串的数量为 n*(n+1)/2 其中 n == length(Moby dick) 它是数十亿个子串...
  • 你研究过 Jaccard 相似度吗? en.m.wikipedia.org/wiki/Jaccard_index
  • @nablag 但是如何在短文本和超长文本中使用它?
  • @Yanirmr 提出了一种滑动窗口方法。首先比较子字符串 1..m,然后是 2..m+1,然后是 3..m+2,等等。正如我所说的非常低效,大约 n 个字符串编辑距离。 (并且不明显如何选择 m。它可能是 m=len(inputstring),但这取决于您期望找到的内容)

标签: python text nlp fuzzy-search corpus


【解决方案1】:

您可以使用基于语料库的拼写校正,然后使用模糊集。对于拼写纠正,您可以使用 symspell 算法的 python 实现。 Here 你可以找到实现 symspell 的存储库列表。将符号拼写与复合配置一起使用。

  • 使用经过语料库训练的拼写员来拼写正确的短句。
  • 使用fuzzyset/fuzzywuzzy 查找拼写之间的相似度分数 更正的句子和语料库中的每个句子。
  • 如果相似度高于 阈值,称之为匹配

【讨论】:

  • 谢谢,但我有两个问题:(1)不属于原始语料库的短语会怎样? (2) 更正后如何找到匹配项?
  • (1) 不属于语料的阶段修正后保持不变。 symspell 使用基于编辑距离的校正,因此如果编辑距离超过配置,则不会对短语单词进行任何更改。 (2) 拼写纠正后,您可以将词组与语料库中的每个句子进行匹配。
  • 关于 (2) - 你知道如何有效地做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 2016-08-17
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多