2015-06-05 2 views
-1

У меня есть список словарей, содержащих слово и некоторые орфографические ошибки. Я пытаюсь пройти список строк и сначала подсчитать вхождения этого слова, а затем подсчитать случаи каждого орфографического перевода. Я пробовал использовать if word in string, но это заканчивается тем, что я дал неверный счет, так как многие орфографические ошибки содержат само само слово в них. Можно ли использовать питоны counter здесь или будет ли смысл регулярного выражения?Подсчет слов в списке с помощью словаря

Например, у меня есть

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

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

Я ищу, чтобы пройти через список строк и в конце есть общее количество каждого слова и его опечатки. У меня возникают проблемы с орфографическими ошибками, такими как achiev, которые при использовании if word in string будут считать бесполезным счет, потому что достигнут успеха, поэтому счетчики будут отключены.

+0

You необходимо предоставить больше контекста. У вас есть код и образцы того, что вы пытаетесь? Ожидаемый результат тоже помогает. – Andy

+0

Можете ли вы сделать пример слова с ошибками, которые вызывают двойной счет? –

+0

http://stackoverflow.com/help/mcve – IanAuld

ответ

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 ответ.

Чтобы посчитать опечатка и оригинал просто проверить, если значение, возвращенное из слов Сыроватского поиска равно слову, если так обновить счетчик 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}}) 
0

Regex, возможно, является хорошим инструментом для этого - word boundary anchors поможет вам избежать подматриц в словах.

Для каждого слова создайте регулярное выражение с использованием wordre = re.compile(r"\b" + word + r"\b", re.I|re.U), а затем посчитайте результат re.findall(wordre, string).