1

Pythonを使用して、テキストから文を抽出しようとしています。テキスト内のすべての単語は、その単語に関連する追加情報とともに行に書かれています。

Mary Noun Name
loves Verb No-Name
John Noun Name
. Punct No-Name

文の境界は空行でマークされます。特定の機能を持つ単語を含む文全体を抽出したい (名前のある文など)。

これまでのところ、文全体ではなく、関心のある単語のみを抽出できました。私.readlines()はテキストを一行一行読んでいました。次に、行をループ処理し、 re と を使用して行.split('\t')を分割し、すべての行が 3 つの要素のリストで表されるようにします。次に、リスト内の要素を目的の値と一致させ、関連する単語を抽出できますが、文全体を抽出する方法がわかりません..

誰かアドバイスはありますか?

4

4 に答える 4

1

空白行で分割し、タイプをセットに分割して、それを使用することができます-テストされていない例...

text="""Mary Noun Name
loves Verb No-Name
John Noun Name
. Punct No-Name

John Noun Name
loves Verb No-Name
Mary Noun Name
. Punct No-Name"""

from itertools import takewhile

sentences = []
split = iter(text.splitlines())
while True:
    sentence = list(takewhile(bool, split))
    if not sentence:
        break
    types = set(el.split()[1] for el in sentence)
    words = [el.split(' ', 1)[0] for el in sentence]
    sentences.append(
        {
        'sentence': sentence,
        'types': types,
        'words': words
        }
    )


print sum(1 for el in sentences if 'Noun' in el['types']), 'sentences contain Noun'
print sentences[0]['words']
于 2012-10-15T16:40:25.107 に答える
0

BlenderまたはJonClementsソリューションを、「解析された」文のピクルス化された結果の保存と組み合わせて、次回はその情報をロードして、より迅速に検索を開始できるようにすることができます。

文のリストがメモリに収まらない場合、バイナリピクルを使用する場合は、個々の文情報をピクルスでファイルに順番に保存し、各ピクルス文の前に長さインジケータを保存します。

この余分な労力は、頻繁に検索する必要があり、解析にかなりの時間がかかる場合にのみ価値があります(膨大なテキストがある場合)。

于 2013-03-21T11:09:06.553 に答える
0

既存の回答は、コーパスが一度にメモリに読み込むのに十分小さいことを前提としており、文のデータ構造を構築してからフィルタリングします。そうでない場合 (また、現在はそうであっても、将来はそうではない可能性があります)、何らかのジェネレーター ソリューションを実行する必要があります。同様の質問を見てみましょう: Python: How to loop through blocks of lines and see if you can make it work for you.

個人的には、人は 1 つのツールを強制的に使用することで、より多くの作業を自分で行うことができると思います。この特定の問題は、単純な awk フィルター用に既製のものです。

awk -v RS='\n\n' -v FS='\n' -v ORS='\n\n' -v OFS='\n' '/ Name/'

もちろん、Python でさらに処理を行う場合は、どちらの点も有効ではありません。

于 2012-10-15T17:07:49.393 に答える
0

個々の行を辞書に解析し、句読点 (またはピリオド) で区切られたリストにグループ化できます。

sentences = []
columns = ('word', 'pos', 'type')

with open('file.txt', 'r') as handle:
    sentence = []

    for row in handle:
        chunks = row.split('\t')
        structure = dict(zip(columns, chunks))

        sentence.append(structure)

        if structure['pos'] == 'Punct':
            sentences.append(sentence)
            sentence = []

現在、sentences文のすべての部分を含むリストが含まれています (このコードが機能する場合)。

残りの方法を理解するのはあなたに任せます。for数回ループするだけで、目的の文を簡単に見つけることができます。

リストを指定してセンテンスを出力するには、次のようにして開始します。

print ' '.join((chunk['word'] for chunk in sentence))
于 2012-10-15T16:14:34.607 に答える