3

我正在设计一个文本处理程序,它将从一个长的逐项文本文档中生成一个关键字列表,并为含义相似的单词组合条目。那里有一些指标,但是我遇到了一个新问题,即处理不在我使用的字典中的单词。

我目前正在使用 nltk 和 python,但我这里的问题具有更抽象的性质。给定一个不在字典中的单词,将它解析为字典中的单词的有效方法是什么?我目前唯一的解决方案是遍历字典中的单词并从输入的单词中选择具有最短 Levenshtein 距离(编辑距离)的单词。

显然,这是一种非常缓慢且不切实际的方法,我实际上并不需要字典中的绝对最佳匹配,只要它是一个包含的单词并且非常接近。在解决方案中,效率对我来说更为重要,但也需要基本的准确性。

关于如何将某些未知单词通常解析为字典中的已知单词的任何想法?

4

4 回答 4

1

看起来您需要拼写校正器来匹配字典中的单词。下面的代码有效,直接取自Peter Norvig 编写的博客http://norvig.com/spell-correct.html ,

import re, collections

def words(text): return re.findall('[a-z]+', text.lower()) 

def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model

NWORDS = train(words(file('big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'

def edits1(word):
    splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    deletes    = [a + b[1:] for a, b in splits if b]
    transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]
    replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]
    inserts    = [a + c + b     for a, b in splits for c in alphabet]
    return set(deletes + transposes + replaces + inserts)

def known_edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

def known(words): return set(w for w in words if w in NWORDS)

def correct(word):
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(candidates, key=NWORDS.get)

big.txt 是包含已知单词的字典。

于 2015-04-14T19:27:35.480 回答
0

您的任务听起来真的只是非单词拼写更正,因此相对简单的解决方案是使用现有的拼写检查器,如 aspell 和自定义词典。

一种快速而肮脏的方法是只使用一个语音映射,如 metaphone(这是 aspell 使用的算法之一)。对于从您的字典中派生的每个可能的代码,选择一个代表词(例如,组中最常见的词)作为更正建议,并为没有找到匹配项的情况选择一个默认更正。但是使用 aspell 可能会得到更好的结果。

如果您确实想计算编辑距离,您可以通过在尝试中存储字典和可能的编辑操作来相对快速地完成,请参阅Brill 和 Moore (2000)。如果你有一个相当大的拼写错误及其更正语料库,并且可以实现 Brill 和 Moore 的整个方法,你可能会比 aspell 好很多,但它听起来像 aspell(或任何可以让你创建自己的字典的拼写检查器) ) 足以完成您的任务。

于 2012-06-14T12:17:49.310 回答
0

我看不出有理由使用 Levenshtein distance 来查找含义相似的单词。LD 查看表格(您想将“公共汽车”映射到“卡车”而不是“灌木丛”)。

正确的解决方案取决于您接下来要做什么。

除非您真的需要那些未知单词中的信息,否则我会将它们全部映射到一个通用的“UNKNOWN_WORD”项。

显然,您可以通过上下文和其他特征对未知单词进行聚类(例如,它们是否以大写字母开头)。对于上下文聚类:由于您对含义感兴趣,我会为这些词使用更大的窗口(比如 +/- 50 个词),并且可能使用一个简单的词袋模型。然后,您只需使用一些距离度量(例如,余弦)找到该空间中的向量最接近未知词的已知词。如果您需要有关此的更多信息,请告诉我。

于 2013-08-04T08:33:27.520 回答
0

希望这个答案不会太模糊:

1)听起来您可能需要先查看您的标记化和短语分块层。这是您应该在将符号短语块提交给任何模糊拼写检查之前丢弃它们的地方。

2)我仍然建议编辑距离以在此之后提出任何“拼写错误”标记的替代方案,但这可能会返回一个同样接近的可能性列表。

3)当你有你的可能列表时,你可以使用共现算法从这个列表中选择最相似的候选人。我只有一些可以提供帮助的软件的 java 示例(http://www.linguatools.de/disco/disco_en.html#was)。您可以提交一个词,这将返回该词的同现词。然后,您可以将此列表与“拼写错误”单词的上下文进行比较,并从所有潜在的编辑距离单词中选择重叠最多的单词。

于 2013-03-07T14:58:44.000 回答