2014-01-07 46 views
2

拼寫識別字符串我有一個列表它不能在列表項

['mPXSz0qd6j0 youtube ', 'lBz5XJRLHQM youtube ', 'search OpHQOO-DwlQ ', 
'sachin 47427243 ', 'alex smith ', 'birthday JEaM8Lg9oK4 ', 
'nebula 8x41n9thAU8 ', 'chuck norris ', 
'searcher O6tUtqPcHDw ', 'graham wXqsg59z7m0 ', 'queries K70QnTfGjoM '] 

有一些方法來確定哪些不能在列表項拼寫串並刪除它們?

+1

定義'隨機'。 – Jerry

+0

,因爲您可以看到mPXSz0qd6j0,lBz5XJRLHQM這些不能拼寫的字符串。 – shanks

+1

我能否認爲像混合字母和數字這樣的單詞需要清理的規則? – BMW

回答

3

您可以使用,例如, PyEnchant基本字典檢查和NLTK採取輕微的拼寫問題考慮進去,就像這樣:

import enchant 
import nltk 

spell_dict = enchant.Dict('en_US') # or whatever language supported 

def get_distance_limit(w): 
    ''' 
    The word is considered good 
    if it's no further from a known word than this limit. 
    ''' 
    return len(w)/5 + 2 # just for example, allowing around 1 typo per 5 chars. 

def check_word(word): 
    if spell_dict.check(word): 
     return True # a known dictionary word 

    # try similar words 
    max_dist = get_distance_limit(word) 
    for suggestion in spell_dict.suggest(word): 
     if nltk.edit_distance(suggestion, word) < max_dist: 
      return True 

    return False 

添加的情況下,標準化和數字的過濾器,你會得到一個很好的啓發。

+0

雖然這似乎是一個好方法。這個庫不檢查名詞。例如,根據拼寫檢查,alex不是一個詞。 – shanks

+0

@scu但'Alex'是一個單詞,所以它將作爲'spell_dict.suggest()'的一個選項返回,距離最小。 – bereal

+0

鐳怎麼樣。我知道這在美國人中並不普遍。這是一個普通的印度名字。我曾嘗試使用en_IN語言環境。它沒有提示任何接近它的東西。 – shanks

0

完全可以將您的名單成員與您認爲對您的輸入無效的單詞進行比較。

這可以通過很多方式完成,部分取決於「正確拼寫」的定義以及最終用於比較列表的內容。如果您決定數字排除條目有效,下劃線或混合大小寫,則可以測試正則表達式匹配。

發佈正則表達式,你將不得不決定什麼是有效的字符分裂應該是。它是否是空格(你是否願意突破'ad hoc'('ad'是一個縮寫,'hoc'不是一個單詞))?它是連字符(這將打破連字符的姓氏)?

有了以上這些條件決定的,它只是一個什麼詞,正確的名稱,共同俚語名單的決定,使用和列表理解:

word_list[:] = [term for term in word_list if passes_my_membership_criteria(term)] 

其中passes_my_membership_criteria()是一個包含規則的功能留在單詞列表中,返回False表示您已經決定的內容無效。