проблема с моим циклом в сочетании с выходом - PullRequest
1 голос
/ 19 марта 2019

У меня есть программа, которая объединяет слова, разделенные звездочкой.Программа удаляет звездочку и соединяет первую часть слова (ту, что перед звездочкой) со своей второй частью (той, что после звездочки).Он работает хорошо, за исключением одной основной проблемы: вторая часть (после звездочки) все еще находится в выходных данных.Например, программа объединена ['presi', '*', 'dent'], но 'dent' все еще находится в выходных данных.Я не понял, где проблема с моим кодом.Код ниже:

from collections import defaultdict
import nltk
from nltk.tokenize import word_tokenize
import re
import os
import sys
from pathlib import Path


def main():
    while True:
        try:
            file_to_open =Path(input("\nPlease, insert your file path: "))

            with open(file_to_open) as f:
                words = word_tokenize(f.read().lower())
                break
        except FileNotFoundError:
            print("\nFile not found. Better try again")
        except IsADirectoryError:
            print("\nIncorrect Directory path.Try again")

    word_separator = '*'

    with open ('Fr-dictionary2.txt') as fr:
            dic = word_tokenize(fr.read().lower())

    def join_asterisk(ary):

        for w1, w2, w3 in zip(words, words[1:], words[2:]):
            if w2 == word_separator:
                word = w1 + w3
                yield (word, word in dic)
            elif w1 != word_separator and w1 in dic:
                yield (w1, True)


    correct_words = []
    incorrect_words = []
    correct_words = [w for w, correct in join_asterisk(words) if correct]
    incorrect_words = [w for w, correct in join_asterisk(words) if not correct]
    text=' '.join(correct_words)
    print(correct_words)
    print('\n\n', text)
    user2=input('\nWrite text to a file? Type "Y" for yes or "N" for no:')

    text_name=input("name your file.(Ex. 'my_first_file.txt'): ")
    out_file=open(text_name,"w")

    if user2 =='Y':
        out_file.write(text)
        out_file.close()
    else:
        print('ok')


main()

Интересно, кто-нибудь может помочь мне обнаружить ошибку здесь?

Пример ввода:

Участие в мероприятиях по уходу за престарелыми и парфюмерией * Сеанс австралийского Сеу де Сурсис де ла Сосьете »ferroviaire, at il il soutenu de vant des élusdu Grand-Est réunis à l'Elysée.

Президент Республики, Эммануэль Макрон (Франция), Aux Côtes Du покровитель SNCF, Гийом Пепи, Га Мон Монпарнас, Париж,le 1er juillet 2017. GEOFFROY VAN DER HASSELT / AFP

Вызывает раздражение, парфюмерное, американское высшее образование, а также поезда, оставленные без внимания, оставленные без внимания.Президент Республики.«Великий девелопмент», Франция, 26 февраля, Елисейские каникулы и кадры, Эммануэль Макрон и его дети, находящиеся в центре внимания SNCF, до конца 23-го декабря 2018 года,alors que le chef de l'Etat s'était engagé, durant и dépla * цемент данс Вогезы, эффект * tué en avril 2018, é ce qu'elle reste opération * nelle.

Пример моеготоковый выход:

['les', 'engagements', 'du', 'président', 'dent', 'de', 'la', 'république', 'que', 'sont', 'aussi', 'ceux', 'des', 'dirigeants', 'de', 'la', 'société', 'ferroviaire'] 

Пример моего желаемого выхода:

['les', 'engagements', 'du', 'président', 'de', 'la', 'république', 'sont', 'aussi', 'ceux', 'des', 'dirigeants', 'de', 'la', 'société', 'ferroviaire']

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Оба дополнительных слова (я полагаю) находятся в вашем словаре и, следовательно, возвращаются во второй раз после 2 итераций цикла for, потому что они соответствуют случаю, когда они становятся w1 в строках:

            elif w1 != word_separator and w1 in dic:
                yield (w1, True)

Редизайн вашей join_asterisk функции, кажется, лучший способ сделать это, поскольку любая попытка изменить эту функцию, чтобы пропустить их, была бы невероятно хакерской.

Ниже приведен способ изменения функции, позволяющий пропустить слова, которые уже были включены в качестве второй половины слова, разделенного '*':

incorrect_words = []
def join_asterisk(array):
    ary = array + ['', '']
    i, size = 0, len(ary)
    while i < size - 2:
        if ary[i+1] == word_separator:
            if ary[i] + ary[i+2] in dic:
                yield ary[i] + ary[i+2]
            else:
                incorrect_words.append(ary[i] + ary[i+2])
            i+=2
        elif ary[i] in dic: 
            yield ary[i]
        i+=1

Если вы хотите, чтобы это соответствовало вашей первоначальной функции, ее можно изменить на:

def join_asterisk(array):
    ary = array + ['', '']
    i, size = 0, len(ary)
    while i < size - 2:
        if ary[i+1] == word_separator:
            concat_word = ary[i] + ary[i+2]
            yield (concat_word, concat_word in dic)
            i+=2
        else: 
            yield (ary[i], ary[i] in dic)
        i+=1
0 голосов
/ 19 марта 2019

Я думаю, что эта альтернативная реализация join_asterisk делает то, что вы намереваетесь:

def join_asterisk(words, word_separator):
    if not words:
        return
    # Whether the previous word was a separator
    prev_sep = (words[0] == word_separator)
    # Next word to yield
    current = words[0] if not prev_sep else ''
    # Iterate words
    for word in words[1:]:
        # Skip separator
        if word == word_separator:
            prev_sep = True
        else:
            # If neither this or the previous were separators
            if not prev_sep:
                # Yield current word and clear
                yield current
                current = ''
            # Add word to current
            current += word
            prev_sep = False
    # Yield last word if list did not finish with a separator
    if not prev_sep:
        yield current

words = ['les', 'engagements', 'du', 'prési', '*', 'dent', 'de', 'la', 'républi', '*', 'que', 'sont', 'aussi', 'ceux', 'des', 'dirigeants', 'de', 'la', 'société', 'ferroviaire']
word_separator = '*'
print(list(join_asterisk(words, word_separator)))
# ['les', 'engagements', 'du', 'président', 'de', 'la', 'république', 'sont', 'aussi', 'ceux', 'des', 'dirigeants', 'de', 'la', 'société', 'ferroviaire']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...