如何在 Python 和 Pandas 中实现快速拼写检查?

how to implement fast spellchecker in Python with Pandas?

我处理文本挖掘问题,需要提取所有提到的某些关键字。例如,给定列表:

list_of_keywords = ['citalopram', 'trazodone', 'aspirin']

我需要找到文本中出现的所有关键词。这可以通过 Pandas 轻松完成(假设我的文本是从 csv 文件中读取的):

导入 pandas 作为 pd

df_text = pd.read_csv('text.csv')
df_text['matches'] = df_text.str.findall('|'.join(list_of_keywords))

但是,文中存在拼写错误,有时我的关键字会写成:

'citalopram' as 'cetalopram'

'trazodone' as 'trazadon'

在网上搜索时,我发现了一些关于如何实施 spell checker 的建议,但我不确定在哪里插入拼写检查器,我认为在非常严重的情况下它可能会减慢搜索速度大文本。

作为另一种选择,建议使用带正则表达式的通配符并插入可能混淆的位置(概念上 编写)

.findall('c*t*l*pr*m')

但是我不相信我可以捕获所有可能的问题案例。我尝试了一些开箱即用的拼写检查器,但我的文本有些特殊,我需要一个 'knows' 我的领域(医学领域)的拼写检查器。

问题

有没有什么有效的方法可以从包含拼写错误的文本中提取关键字?

你是对的,你不能用正则表达式捕获所有可能的拼写错误。

但是你有选择。

你可以

  • 使用 trie。许多自动完成和拼写检查解决方案都使用尝试。然而,他们中的大多数都是逐字逐句地操作。不是整个文本
  • 也就是说,您真正想要的是一个模糊文本提取器,因为您只想匹配 alternate/slightly 错误的拼写,而不是更正文本中的那些拼写。所以你在这里也有更多选择
    • 计算基因组学面临着这样的挑战,他们想要在长序列中搜索碱基对的模式。它们允许匹配文本中存在一定程度的不匹配。因此,类似 here 概述的近似匹配解决方案会有所帮助。这些幻灯片很好地利用了鸽子洞原理来做你需要的,而且代码也是开源的!
    • 如果您想要不那么复杂的东西,只需 运行 对文档的所有单词进行编辑距离过滤,只接受编辑距离为 k 或更小的单词。

扩展我所说的编辑距离

(Images/Code 从上面链接的幻灯片中借用,幻灯片可供任何人免费使用,即没有许可证)

让我们研究一个更简单的概念汉明距离

def hammingDistance(x,  y):
    assert len(x) == len(y)
    nmm = 0
    for i in xrange(0,  len(x)):
        if x[i] != y[i]:
            nmm += 1
    return nmm

汉明距离returns 两个等长字符串之间必须交换的字符数才能使它们相等。

但是当字符串长度不相等时会发生什么?

使用 editDistance 这是必须 swapped/inserted/deleted 在 2 个字符串上使它们相等的字符数

汉明距离现在成为递归算法的基本情况

def edDistRecursive(x, y):
    if len(x) == 0: return len(y)
    if len(y) == 0: return len(x)
    delt = 1 if x[-1] != y[-1] else 0
    diag = edDistRecursive(x[:-1], y[:-1]) + delt
    vert = edDistRecursive(x[:-1], y) + 1
    horz = edDistRecursive(x, y[:-1]) + 1
    return min(diag, vert, horz)

只需根据您认为 would/should 匹配的内容调用上面的函数(可能首先查找一个特里树)。您甚至可以记忆 soln 以使其更快,因为重叠的可能性很高