【问题标题】:how to implement fast spellchecker in Python with Pandas?如何使用 Pandas 在 Python 中实现快速拼写检查器?
【发布时间】:2018-08-15 20:18:06
【问题描述】:

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

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

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

将熊猫导入为 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')

但是我不相信我可以捕捉到所有可能的问题案例。我尝试了一些开箱即用的拼写检查器,但我的文本有些具体,我需要一个“了解”我的领域(医学领域)的拼写检查器。

问题

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

【问题讨论】:

    标签: python pandas nlp spell-checking


    【解决方案1】:

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

    但是你确实有选择。

    你可以

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

    扩展编辑距离的含义

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

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

    概念
    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
    

    汉明距离返回必须在 2 个等长字符串之间交换以使它们相等的字符数。

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

    使用 editDistance 这是必须在 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)
    

    只需根据您认为单词将/应该匹配的内容调用上面的函数(也许首先查找一个 trie)。您甚至可以记住解决方案以使其更快,因为重叠的可能性很高

    【讨论】:

    • 谢谢!我喜欢你的建议,一定会尝试的。我认为,鉴于我需要处理大量文本,计算距离就足够了(也受到 Peter Norvig 实现的启发)。我需要四处玩耍并实际测试它的速度。我会[约会我的进步!
    • 当然 :) 祝你好运!您也可以尝试 Levenshtein 距离 :)
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多