2

現在、Python v2.6 を使用しており、単語を 1 行にマージしようとしています。私のコードは、テキスト ファイルからデータを読み取ることになっており、その中には 2 行のデータがあり、どちらも文字列です。次に、次のように区切り文字列で区切られた文の単語である 2 行目のデータを毎回取得します。

.txt 内:

"delimiter_string"
"row_1_data" "row_2_data"  
"row_1_data" "row_2_data"  
"row_1_data" "row_2_data"  
"row_1_data" "row_2_data"  
"row_1_data" "row_2_data"  
"delimiter_string" 
"row_1_data" "row_2_data"  
"row_1_data" "row_2_data"  
...

これらの「row_2_data」は、後で文に追加されます。長い紹介で申し訳ありません。

これが私のコードです:

import sys
import re

newLine = ''

for line in sys.stdin:

    word = line.split(' ')[1]

    if word == '<S>+BSTag': 
        continue

    elif word == '</S>+ESTag':
        print newLine
        newLine = ''
        continue

    else:
        w = re.sub('\[.*?]', '', word)

        if newLine == '':
            newLine += w
        else:
            newLine += ' ' + w

"BSTag" は "Sentence Begins" のタグで、"ESTag" は "Sentence Ends" のタグです。いわゆる "delimiters" です。「re.sub」は特殊な用途に使用されており、確認した限りでは動作します。

問題は、次のコマンドを使用して Linux のコマンド ラインからこの python スクリプトを実行すると、次のようになることです。スクリプト.py | 出力が表示されず、空のファイルだけが表示されます。

Linux に慣れていない方は、端末の実行とは関係ない問題だと思いますので、その部分は無視してかまいません。単純に、コードが意図したとおりに機能せず、間違いが 1 つも見つかりません。

長い投稿を読んでくれてありがとう:)


OK、問題は解決しました。これは実際にはコーディング エラーではなくコーパス エラーでした。テキスト ファイルで非常に奇妙なエントリが検出され、問題が発生していました。それを削除すると解決しました。同様のテキスト処理が必要な場合は、私のアプローチと「snurre」によって提示されたアプローチの両方を使用できます。

乾杯。

4

2 に答える 2

1
def foo(lines):
    output = []
    for line in lines:
        words = line.split()
        if len(words) < 2:
            word = words[0]
        else:
            word = words[1]
        if word == '</S>+ESTag':
            yield ' '.join(output)
            output = []
        elif word != '<S>+BSTag':
            output.append(words[1])

for sentence in foo(sys.stdin):
    print sentence

あなたの正規表現は少しファンキーです。私が知る限り、 と のペアの間 (および含む) を に置き換えている[ため]''最終的に空の文字列が出力されます。

于 2012-12-21T16:36:35.847 に答える
0

問題は、スクリプトが実行されていないことだと思います(投稿したコードでシバンを除外しただけでない限り)

これを試して

cat file.txt | python script.py | less
于 2012-12-21T16:35:03.593 に答える