2014-01-16 93 views
1

我試圖從網絡論壇中抽取大量自然語言,並使用PyEnchant更正拼寫。該文本通常是非正式的,關於醫療問題,所以我創建了一個包含相關醫療詞語,聊天縮略語等的文本文件「test.pwl」。在某些情況下,不幸的是,一點點的HTML,網址等都留在它裏面。PyEnchant將字典中的單詞「糾正」爲不在字典中的單詞

我的腳本旨在同時使用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年的被認爲majorly由其他人

鬱悶,我得到這個:

我的新dotor覺得我現在兩極。這個,aftER 9年被其他人大大沮喪了

我可以處理案件的變化,但醫生 - > dotor根本就沒有好處。當輸入短得多(例如,上面的報價是整個輸入),結果是可取的:

我的新醫生認爲我現在是兩極的。這是經過9年被大家沮喪的被其他人鄙視之後

難道有人向我解釋爲什麼?用非常簡單的話來說,因爲我對編程非常陌生,對Python更新。一步一步的解決方案將不勝感激。

回答

1

我認爲你的問題是你正在替換字母序列裏面的單詞。 「ER」可能是「er」的有效拼寫更正,但這並不意味着您應該將「考慮」更改爲「considERed」。

您可以使用正則表達式代替簡單的文本替換,以確保只替換完整的單詞。 「\ 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' 
+0

謝謝隊友。我知道正則表達式,但是對於編程和Python來說是如此的新鮮,我不知道如何在我的代碼中實現邊界分隔符。線索? – user2437842

+0

我在做些什麼:textdata = textdata.replace(「\\ b」+ mspellword +「\\ b」,「\\ b」+ picksuggestion +「\\ b」) – user2437842

+0

@ user2437842不是,您需要要使用像re.sub而不是字符串replace的正則表達式函數。查看我的答案以及[documentation]中的代碼(http://docs.python.org/2/library/re.html#re.sub)。你可以構造正則表達式爲「\\ b」+ re.escape(mspellword)+「\\ b」'。你想插入的文本作爲替換('picksuggestion')不應該被轉換成正則表達式。 – svk

1
#replace every occurence of the bad word with the suggestion 
    #this is almost certainly a bad idea :) 

你是對的,那一個壞主意。這是導致「考慮」被「考慮」取代的原因。此外,即使您沒有找到建議,您也正在進行更換。將替換移動到if len(suggestions) > 0塊。

至於替換單詞的每個實例,您想要做的是將拼寫錯誤的單詞的位置與拼寫錯誤的單詞的文本一起保存(或者可能只是位置,您可以查看單詞中的單詞稍後當您正在尋找建議時發短信),允許重複拼寫錯誤的單詞,並且只能用其建議替換單個單詞。不過,我會留下實現細節和優化。一步一步的解決方案不會幫助你學到很多東西。

+0

我很欣賞你的智慧和精神。謝謝。我希望我的父親有時候更像你。這就是說,恐怕你所描述的完全不在我的範圍之內。保存單詞的位置並允許重複是我從未夢想過的事情。我很高興'爲此工作',但我認爲我需要一個開始。做個朋友? – user2437842

+0

@ user2437842嘿,夠公平的。看看元組。 「(word,position)'元組應該可以工作。 –