使用字典计算列表中的单词

时间:2015-06-05 14:25:15

标签: python nlp

我有一个字典列表,其中包含单词和单词的拼写错误。我试图通过一个字符串列表,并首先计算该单词的出现次数,然后计算每个拼写错误的出现次数。我已经尝试过使用if word in string,但这最终给了我一个不正确的计数,因为许多拼写错误包含其中的实际单词本身。是否有可能在这里使用pythons counter或者regex更有意义吗?

例如我有

words = [{'word':'achieve','misspellings':  ['acheive','acheiv','achiev']},

        {'word':'apparently','misspellings':['apparantly','apparintly']}]

我希望查看字符串列表,最后得出每个单词及其拼写错误的总数。我在像missv这样的拼写错误上遇到了问题,因为当使用if word in string会导致计数陷入混乱时,因为实现了,所以计数将被关闭。

2 个答案:

答案 0 :(得分:2)

您应该将拼写错误的单词映射到原始单词:

words = {'acheive':'achieve', 'achiev':'achieve','achieve':'achieve'}

s = "achiev acheive achieve"

from collections import Counter

from string import punctuation

cn = Counter()
for word in s.split():
    word = word.strip(punctuation)
    if word in words:
        wrd = words[word]
        cn[wrd] += 1

print(cn)
Counter({'achieve': 3})

您可以将它与正则表达式结合使用,以查找字符串中的所有单词,而不是按照分割 Tim Pietzcker's回答。

要计算拼写错误的和原始的,只需检查单词dict lookup返回的值是否等于单词,如果是,则更新单词的orig计数或者更新未命中计数:

words = {'acheive':'achieve', 'achiev':'achieve','achieve':'achieve',
         'apparently':'apparently','apparantly':'apparently','apparintly':'apparently'}


s = "achiev acheive achieve! 'apparently' apparintly 'apparantly?""

from collections import defaultdict
from string import punctuation

cn = defaultdict(lambda:{"orig": 0 ,"miss":0})
for word in s.split():
    word = word.strip(punctuation)
    if word in words:
        wrd = words[word]
        if wrd == word:
           cn[wrd]["orig"] += 1
        else:
            cn[wrd]["miss"] += 1
print(cn)
defaultdict(<function <lambda> at 0x7f001fb2a8c0>, 
{'apparently': {'miss': 2, 'orig': 1}, 'achieve': {'miss': 2, 'orig': 1}})

答案 1 :(得分:0)

正则表达式可能是一个很好的工具 - word boundary anchors可以帮助您避免单词中的子匹配。

对于每个单词,使用wordre = re.compile(r"\b" + word + r"\b", re.I|re.U)构建正则表达式,然后计算re.findall(wordre, string)的结果。