2014-02-18 2 views
1

У меня есть объект типа серии, где я должен применить функцию, которая использует биграммы для исправления слова в случае, если оно встречается с другим. Я создал список bigrams, отсортировал его по частоте (наивысшая на первом месте) и назвала его fdist.Заменить слова на основе Bigram Frequency, Python

bigrams = [b for l in text2 for b in zip(l.split(" ")[:-1], l.split(" ")[1:])] 
freq = nltk.FreqDist(bigrams) #computes freq of occurrence 
fdist = freq.keys() # sorted according to freq 

Далее я создал функцию, которая принимает каждую строку («или предложение», «объект из списка») и использует Биграммные, чтобы решить, следует ли исправить его дальше или нет.

def bigram_corr(line): #function with input line(sentence) 
    words = line.split() #split line into words 
    for word1, word2 in zip(words[:-1], words[1:]): #generate 2 words at a time words 1,2 followed by 2,3 3,4 and so on 
     for i,j in fdist: #iterate over bigrams 
      if (word2==j) and (jf.levenshtein_distance(word1,i) < 3): #if 2nd words of both match, and 1st word is at an edit distance of 2 or 1, replace word with highest occurring bigram 
       word1=i #replace 
       return word1 #return word 

Проблема заключается в том, что только одно слово возвращается в течение всего предложения, например:
«Lts идти twards на востоке» заменяется позволяет. Похоже, что дальнейшие итерации не работают.
для цикла для word1, word2 работает так: «Lts идти» в 1-й итерации, который будет в конечном счете заменен «позволяет», как позволяет происходит более часто с «идти»

«идти к» во 2-м итерация.

«в сторону» на третьей итерации .. и так далее.

Существует незначительная ошибка, которую я не могу вычислить, пожалуйста, помогите.

+0

Просьба уточнить. Каков ожидаемый результат 'bigram_corr (« Давайте идти к востоку »)?? – Kevin

+0

отредактировал его, пожалуйста, проверьте. Мне нужно, чтобы все предложение было возвращено. –

+0

Вы возвращаетесь преждевременно. – 2rs2ts

ответ

4

Похоже, вы делаете word1 = i с ожиданием, что это изменит содержимое words. Но этого не произойдет. Если вы хотите изменить words, вам нужно будет сделать это напрямую. Используйте enumerate для отслеживания индекса word1.

Как указано 2rs2ts, вы возвращаетесь раньше. Если вы хотите, чтобы внутренний цикл завершился, как только вы найдете первую хорошую замену, break вместо возврата. Затем вернитесь в конце функции.

def bigram_corr(line): #function with input line(sentence) 
    words = line.split() #split line into words 
    for idx, (word1, word2) in enumerate(zip(words[:-1], words[1:])): 
     for i,j in fdist: #iterate over bigrams 
      if (word2==j) and (jf.levenshtein_distance(word1,i) < 3): #if 2nd words of both match, and 1st word is at an edit distance of 2 or 1, replace word with highest occurring bigram 
       words[idx] = i 
       break 
    return " ".join(words) 
+0

Да, я думаю, что это может быть ближе к тому, что пытался сделать OP, чем то, что я предлагал, на основе слова word1 = i. – 2rs2ts

+0

kevin спасибо, твоя работа красиво .. :) –

1

Заявление return полностью останавливает функцию. Я думаю, что вы хотите:

def bigram_corr(line): 
    words = line.split() 
    words_to_return = [] 
    for word1, word2 in zip(words[:-1], words[1:]): 
     for i,j in fdist: 
      if (word2==j) and (jf.levenshtein_distance(word1,i) < 3): 
       words_to_return.append(i) 
    return ' '.join(words_to_return) 

Это ставит каждое из слов, которые вы обработали в список, затем воссоединяется их пробелами и возвращает всю строку, так как вы сказали что-то о возвращении «все предложение. "

Я не уверен, что семантика вашего кода верна, так как у меня нет библиотеки jf или что бы вы ни использовали, и поэтому я не могу проверить этот код, так что это может или может не полностью решить вашу проблему. Но это поможет.

+0

words_to_return = [] должен появиться после 1-го цикла, правильно? coz он будет становиться все больше и больше с несколькими предложениями. –

+0

@Sword Что вы ожидали передать как 'line'? Я предположил, что это будет строка текста, заканчивающаяся символом новой строки ('' \ n''). Но нет, это правильное место, чтобы положить 'words_to_return'. – 2rs2ts

+0

да true .. я инициализировал его после цикла и получил ошибку. Я выполнил его сейчас. ... см. .. –

Смежные вопросы