python - 如何使用 Pandas 在 Python 中实现快速拼写检查器?

标签 python pandas nlp spell-checking

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

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')

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

问题

是否有任何有效的方法可以从文本中提取关键字(包括拼写错误)?

最佳答案

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

但是您确实有选择。

你可以

  • 使用 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)

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

关于python - 如何使用 Pandas 在 Python 中实现快速拼写检查器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51865832/

相关文章:

python - 在 python 系列中的哪个月找到 Item wise max sales?

python-3.x - 使用 shift() 比较行元素

python - spaCy,准备训练数据 : doc. char_span 返回 'None'

python - 如何在 QSplitter 中设置 QTreeView 的初始大小?

python - 无法从 django 与 MySQL 通信,但可以直接在 python 中

python - 为什么保存未使用的变量会产生影响?

pandas - 通过单个列搜索具有分层索引的Pandas Dataframe

nlp - 使用 Spacy 查找俄语引理(那些没有模型的语言)

machine-learning - 为什么向量归一化可以提高聚类和分类的准确性?

python - 生成长度等于文件中时间长度的字符串,每秒 1 个标签,python