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]]

c_dataは中国語の文章
e_dataのファイル、 は英語の文章のファイルです。
bitext相互の翻訳である英語と中国語の文のペアを含むリストである必要があります。

両方のデータ ファイルが巨大である
ため、特定の長さ以下の文のみを考慮して、コードの複雑さを軽減したいと考えています。長さは文字単位で測定されます。

例として、
ここでは長さを として指定しました100:opts.num_sentsは、データ ファイルから考慮すべきセンテンスの数を示す変数です。

問題/バグ
たとえば、中国語の文章が 95 文字で、英語の文章が 105 文字の場合bitext、中国語の文章のみで更新されます。
しかし、両方の文が指定された長さを下回っている場合にのみ、コードに文のペアを追加する必要があります。
どうすればいいですか?

4

3 に答える 3

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
于 2013-03-04T10:29:39.600 に答える
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を変更します。

于 2013-03-04T10:27:55.550 に答える
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)]

これはリスト内包表記では非常に醜いので、ここで提案されている他の方法のいずれかを使用することをお勧めします。

于 2013-03-04T10:30:51.857 に答える