gpt4 book ai didi

python - 我的for循环与yield相结合的问题

转载 作者:行者123 更新时间:2023-12-01 08:11:10 25 4
gpt4 key购买 nike

我有一个程序,可以连接由星号分隔的单词。该程序删除星号并将单词的第一部分(星号之前的部分)与其第二部分(星号之后的部分)连接起来。它运行良好,除了一个主要问题:第二部分(星号之后)仍在输出中。例如,程序连接了 ['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()

我想知道是否有人可以帮我检测这里的错误?

输入示例:

Les engage * ments du prési * dent de la Républi * que sont aussi ceux des dirigeants de la société » ferroviaire, a-t-il soutenu de vant des élus du Grand-Est réunis à l’Elysée.

Le président de la République, Emmanuel Macron (à droite), aux cô * tés du patron de la SNCF, Guillaume Pepy, à la gare Montparnasse, à Paris, le 1er juillet 2017. GEOFFROY VAN DER HASSELT / AFP

L’irrita tion qui, par fois, s’empare des usa * gers de la SNCF face aux trains suppri * més ou aux dessertes abandonnées semble avoir aussi saisi le président de la République. Devant des élus du Grand-Est, réunis mardi 26 février à l’Elysée dans le cadre du grand débat, Emmanuel Macron a eu des mots très durs contre la SNCF, qui a fermé la ligne Saint-Dié - Epinal le 23 décembre 2018, alors que le chef de l’Etat s’était engagé, durant un dépla * cement dans les Vosges effec * 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']

最佳答案

这两个额外的单词(我假设)都在你的字典中,因此在 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

关于python - 我的for循环与yield相结合的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55244152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com