我有这行代码:
bitext = [[sentence.strip().split()
for sentence in pair if len(sentence) < 100]
for pair in zip(open(c_data), open(e_data))[:opts.num_sents]]
c_data
是一个中文句子的文件
e_data
是一个带英文句子的文件
bitext
应该是包含成对的英语和中文句子的列表,这些句子是彼此的翻译。
由于两个数据文件都很庞大, 我想通过仅考虑一定长度的句子来降低代码的复杂性。长度以字符为单位。
例如,
我在这里指定的长度为100
。 :opts.num_sents
是一个变量,用于说明应该考虑数据文件中的句子数。
问题/错误
如果中文句子为95个字符,英文句子为105个字符,bitext
将仅用中文句子更新。
但我希望代码只添加一对句子,如果它们都在规定的长度内
我该怎么做?
答案 0 :(得分:2)
是时候打破这个单线:
def tokenize(sentence):
return sentence.strip().split()
def sentence_pairs(c_data, e_data):
for chinese, english in zip(open(c_data), open(e_data))[:opts.num_sents]:
if len(chinese) < 100 and len(english) < 100
yield tokenize(chinese), tokenize(english)
yield
关键字将sentence_pairs
转换为生成器。如果你只是迭代结果,那么这是一种更简单的写作方式:
def sentence_pairs(c_data, e_data):
results = []
for chinese, english in zip(open(c_data), open(e_data))[:opts.num_sents]:
if len(chinese) < 100 and len(english) < 100
results.append((chinese, english))
return results
答案 1 :(得分:1)
首先,重写您的代码,以便它是可以理解的!列表理解很好,但当它们在页面末尾消失时,它们很难理解。
bitext = [[sentence.strip().split() for sentence in pair if len(sentence) < 100] for pair in zip(open(c_data), open(e_data)) [:opts.num_sents]]
与
相同(基本上)bitext = []
for i, pair in enumerate(zip(open(c_data), open(e_data))):
if i < opts.num_sents:
sentence_pair = []
for sentence in pair:
if len(sentence) < 100:
sentence_pair.append(sentence.strip().split())
if len(sentence_pair) > 1: # ie both sentences are < 100
bitext.append(sentence_pair)
现在,您要添加长度为> 100
的句子。你可以看到该行
if len(sentence) < 100:
正在阻止,所以改变100。
答案 2 :(得分:1)
我认为你要做的就是这个:
bitext = [[sentence.strip().split() for sentence in pair]
for pair in zip(open(c_data), open(e_data))[:opts.num_sents] if all(len(s) < 100 for s in pair)]
列表理解中非常难看,我建议您使用此处建议的其他方法之一。