2014-11-02 3 views
0

У меня возникли проблемы с некоторым кодом Python. У меня есть большой текстовый файл с именем «big.txt». Я повторил это в своем коде, чтобы отсортировать каждое слово в массиве (или списке), а затем повторить его снова, чтобы удалить любой символ, который не находится в алфавите. У меня также есть функция, называемая worddistance, которая смотрит, как похожи два слова и возвращает результат впоследствии. У меня есть другая функция: autocorrect. Я хочу передать эту функцию словом с ошибкой и напечатать предложение 'Did you mean...' со словами, которые дали низкий балл по функции worddistance (функция добавляет 1 к счетчику всякий раз, когда разница замечена - чем ниже оценка, тем больше похоже).
Как ни странно, я получаю ошибку:Ошибка индекса при сравнении строк - Python

"Index Error: string index out of range"

Я в недоумении на то, что происходит!

Мой код ниже.

Заранее спасибо за ответы,
Samuel Нотон

f = open("big.txt", "r") 

words = list() 

temp_words = list() 
for line in f: 
    for word in line.split(): 
     temp_words.append(word.lower()) 

allowed_characters = 'abcdefghijklmnopqrstuvwxyz'  
for item in temp_words: 
    temp_new_word = '' 
    for char in item: 
     if char in allowed_characters: 
      temp_new_word += char 
     else: 
      continue 
    words.append(temp_new_word) 
list(set(words)).sort() 

def worddistance(word1, word2): 
    counter = 0 
    if len(word1) > len(word2): 
     counter += len(word1) - len(word2) 
     new_word1 = word1[:len(word2) + 1] 
     for char in range(0, len(word2) + 1) : 
      if word2[char] != new_word1[char]: 
       counter += 1 
      else: 
       continue 
    elif len(word2) > len(word1): 
     counter += len(word2) - len(word1) 
     new_word2 = word2[:len(word1) + 1] 
     for char in range(0, len(word1) + 1): 
      if word1[char] != word2[char]: 
       counter += 1 
      else: 
       continue 
    return counter 

def autocorrect(word): 
    word.lower() 
    if word in words: 
     print("The spelling is correct.") 
     return 
    else: 
     suggestions = list() 
     for item in words: 
      diff = worddistance(word, item) 
      if diff == 1: 
       suggestions.append(item) 
     print("Did you mean: ", end = ' ') 

    if len(suggestions) == 1: 
       print(suggestions[0]) 
       return 

    else: 
     for i in range(0, len(suggestions)): 
      if i == len(suggestons) - 1: 
       print("or " + suggestions[i] + "?") 
       return 
      print(suggestions[i] + ", ", end="") 
      return 
+0

На какой линии вы получаете эту ошибку – user3378649

ответ

0

В worddistance(), это выглядит как for char in range(0, len(word1) + 1): должно быть:

for char in range(len(word1)): 

И for char in range(0, len(word2) + 1) : должно быть:

for char in range(len(word2)): 

И, кстати, list(set(words)).sort() сортирует временный список, который, вероятно, не тот, который вы хотите. Оно должно быть:

words = sorted(set(words)) 
0

Как уже упоминалось в другой комментарий, вы должны range(len(word1)).

В дополнение к этому: - Вы должны рассмотреть случай, когда word1 и слова имеют одинаковую длину #len(word2) == len(word1) - Вы должны также позаботиться о именовании. Во втором состоянии в функции wordDistance

if word1[char] != word2[char]: 

Вы должны быть по сравнению с new_word2

if word1[char] != new_word2[char]: 

- В автозамены, вы должны назначить ниже, чтобы word= word.lower()

words= [] 
for item in temp_words: 
    temp_new_word = '' 
    for char in item: 
     if char in allowed_characters: 
      temp_new_word += char 
     else: 
      continue 
    words.append(temp_new_word) 
words= sorted(set(words)) 

def worddistance(word1, word2): 
    counter = 0 
    if len(word1) > len(word2): 
     counter += len(word1) - len(word2) 
     new_word1 = word1[:len(word2) + 1] 
     for char in range(len(word2)) : 
      if word2[char] != new_word1[char]: 
       counter += 1 
    elif len(word2) > len(word1): 
     counter += len(word2) - len(word1) 
     new_word2 = word2[:len(word1) + 1] 
     for char in range(len(word1)): 
      if word1[char] != new_word2[char]: #This is a problem 
       counter += 1 
    else: #len(word2) == len(word1)  #You missed this case 
     for char in range(len(word1)): 
      if word1[char] != word2[char]: 
       counter += 1 
    return counter 

def autocorrect(word): 
    word= word.lower() #This is a problem 
    if word in words: 
     print("The spelling is correct.") 
    else: 
     suggestions = list() 
     for item in words: 
      diff = worddistance(word, item) 
      print diff 
      if diff == 1: 
       suggestions.append(item) 
     print("Did you mean: ") 

     if len(suggestions) == 1: 
      print(suggestions[0]) 

     else: 
      for i in range(len(suggestions)): 
       if i == len(suggestons) - 1: 
        print("or " + suggestions[i] + "?") 
       print(suggestions[i] + ", ") 

В следующий раз, попробуйте используйте встроенную функцию Python, например enumerate, чтобы избежать использования для i in range(list), затем list[i], len instea d счетчика .. и т.д.

Например: Ваша дистанционная функция может быть написана таким образом или намного проще.

def distance(word1, word2): 
    counter= max(len(word1),len(word2))- min(len(word1),len(word2)) 
    if len(word1) > len(word2): 
     counter+= len([x for x,z in zip (list(word2), list(word1[:len(word2) + 1])) if x!=z]) 
    elif len(word2) > len(word1): 
     counter+= len([x for x,z in zip (list(word1), list(word2[:len(word1) + 1])) if x!=z]) 
    else: 
     counter+= len([x for x,z in zip (list(word1), list(word2)) if x!=z]) 
    return counter 
Смежные вопросы