PyEnchant "исправляет" слова в словаре, чтобы слова не в словаре
Я пытаюсь взять большое количество естественного языка с веб-форума и исправить орфографию с помощью PyEnchant. Текст часто носит неофициальный характер и касается медицинских вопросов, поэтому я создал текстовый файл "test.pwl", содержащий соответствующие медицинские слова, сокращения чата и так далее. В некоторых случаях, к сожалению, в нем остаются небольшие фрагменты html, url и т. Д.
Мой скрипт предназначен для использования словаря en_US и PWL, чтобы найти все слова с ошибками и исправить их в соответствии с первым предложением d.suggest полностью автоматически. Он печатает список слов с ошибками, затем список слов, у которых не было предложений, и записывает исправленный текст в spellfixed.txt:
import enchant
import codecs
def spellcheckfile(filepath):
d = enchant.DictWithPWL("en_US","test.pwl")
try:
f = codecs.open(filepath, "r", "utf-8")
except IOError:
print "Error reading the file, right filepath?"
return
textdata = f.read()
mispelled = []
words = textdata.split()
for word in words:
# if spell check failed and the word is also not in
# mis-spelled list already, then add the word
if d.check(word) == False and word not in mispelled:
mispelled.append(word)
print mispelled
for mspellword in mispelled:
#get suggestions
suggestions=d.suggest(mspellword)
#make sure we actually got some
if len(suggestions) > 0:
# pick the first one
picksuggestion=suggestions[0]
else: print mspellword
#replace every occurence of the bad word with the suggestion
#this is almost certainly a bad idea :)
textdata = textdata.replace(mspellword,picksuggestion)
try:
fo=open("spellfixed.txt","w")
except IOError:
print "Error writing spellfixed.txt to current directory. Who knows why."
return
fo.write(textdata.encode("UTF-8"))
fo.close()
return
Проблема в том, что вывод часто содержит "исправления" для слов, которые были либо в словаре, либо в pwl. Например, когда первая часть ввода была:
Мой НОВЫЙ доктор чувствует, что я теперь биполярный. Это, после того, как 9 лет все остальные находились в депрессии
Я получил это:
Мой НОВЫЙ Дотор чувствует, что я теперь биполярный. Это, после 9 лет, которые в основном были расстроены кем-либо еще
Я мог бы справиться с изменениями случая, но доктор -> Дотор не годится. Когда входные данные намного короче (например, приведенная выше цитата представляет собой весь результат), результат желателен:
Мой НОВЫЙ доктор чувствует, что я теперь биполярный. Это, после того, как 9 лет все остальные находились в депрессии
Кто-нибудь может объяснить мне, почему? Проще говоря, пожалуйста, так как я новичок в программировании и новичок в Python. Пошаговое решение будет с благодарностью.
2 ответа
Я думаю, что ваша проблема в том, что вы заменяете последовательности букв внутри слов. "ER" может быть корректным исправлением орфографии для "er", но это не означает, что вы должны изменить "с учетом" на "conidERed".
Вы можете использовать регулярные выражения вместо простой замены текста, чтобы обеспечить замену только полных слов. "\b" в регулярном выражении означает "границу слова":
>>> "considered at the er".replace( "er", "ER" )
'considERed at the ER'
>>> import re
>>> re.sub( "\\b" + "er" + "\\b", "ER", "considered at the er" )
'considered at the ER'
#replace every occurence of the bad word with the suggestion
#this is almost certainly a bad idea :)
Вы были правы, это плохая идея. Это то, что приводит к тому, что слово "считается" заменяется словом "рассмотрено". Кроме того, вы делаете замену, даже если вы не нашли предложения. Переместить замену в if len(suggestions) > 0
блок.
Что касается замены каждого экземпляра слова, то вместо этого вы хотите сохранить позиции слов с ошибками вместе с текстом слов с ошибками (или, может быть, только позиции, и вы можете искать слова в тексте позже, когда вы ищите предложения), разрешите дублировать слова с ошибками и замените только отдельное слово своим предложением.
Я оставлю детали реализации и оптимизации на ваше усмотрение. Пошаговое решение не поможет вам узнать больше.