如何在 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 以使其更快,因为重叠的可能性很高
我处理文本挖掘问题,需要提取所有提到的某些关键字。例如,给定列表:
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 以使其更快,因为重叠的可能性很高