0

私は現在、基本的なコーパス データベースを作成し、テキストをトークン化するプロジェクトに取り組んでいます。しかし、私は問題に行き詰まっているようです。これらのものがあると仮定します:

import os, re

texts = []

for i in os.listdir(somedir): # Somedir contains text files which contain very large plain texts.
    with open(i, 'r') as f:
        texts.append(f.read())

ここで、トークンの前後の単語を見つけたいと思います。

myToken = 'blue'
found = []
for i in texts:
    fnd = re.findall('[a-zA-Z0-9]+ %s [a-zA-Z0-9]+|\. %s [a-zA-Z0-9]+|[a-zA-Z0-9]+ %s\.' %(myToken, myToken, myToken), i, re.IGNORECASE|re.UNICODE)
    found.extend(fnd)

print myToken
for i in found:
    print '\t\t%s' %(i)

トークンが文を開始する、トークンが文を終了する、またはトークンが文のどこかに現れる可能性があるため、上記の正規表現ルールを使用しました。実行すると、次のようなことに出くわします。

blue
    My blue car # What I exactly want.
    he blue jac # That's not what I want. That must be "the blue jacket."
    eir blue phone # Wrong! > their
    a blue ali # Wrong! > alien
    . Blue is # Okay.
    is blue. # Okay.
    ...

\b\w\b または \b\W\b も試しましたが、残念ながら、間違った結果を返す代わりに結果が返されませんでした。私は試した:

'\b\w\b%s\b[a-zA-Z0-9]+|\.\b%s\b\w\b|\b\w\b%s\.'
'\b\W\b%s\b[a-zA-Z0-9]+|\.\b%s\b\W\b|\b\W\b%s\.'

質問が曖昧すぎないことを願っています。

4

3 に答える 3

3

あなたが望むのは次のとおりだと思います:

  1. (オプション) 単語とスペース。
  2. (常に) 'blue';
  3. (オプション) スペースと単語。

したがって、1 つの適切な正規表現は次のようになります。

r'(?i)((?:\w+\s)?blue(?:\s\w+)?)'

例えば:

>>> import re
>>> text = """My blue car
the blue jacket
their blue phone
a blue alien
End sentence. Blue is
is blue."""
>>> re.findall(r'(?i)((?:\w+\s)?{0}(?:\s\w+)?)'.format('blue'), text)
['My blue car', 'the blue jacket', 'their blue phone', 'a blue alien', 'Blue is', 'is blue']

ここでデモとトークンごとの説明を参照してください。

于 2014-08-08T09:23:18.760 に答える