split() で攻める

>>> raw = "(適当なテキスト)"
>>> re.split(r' ', raw)

これだと改行コード(\n)まで含まれてしまう。すべての空白文字をあらわす\sを用いる。

>>> re.split(r'\s+', raw)

これだと括弧やカンマまで含まれてしまう。 すべての英数字、数字、アンダースコア以外の文字、すなわち [^a-zA-Z0-9_] をあらわす\W を用いる。

>>> re.split(r'\W+', raw)

これだとトークン列の最初と最後に空白文字があらわれる。下記の実行例はその象徴である。

>>> 'xx'.split('x')
['', '', '']
>>>

findall() で攻める

>>> re.findall(r'\w+', raw)
>>> re.findall(r'\w+|\S\w*', raw)

このようにすることにより、非空白文字に続いて単語文字が続くようなものがマッチする。 I'm は「I」と「'm」に分けられる。

ハイフンやアポストロフィがあっても1つのトークンと認識されるようには次のようにする。

>>> re.findall(r'\w+([-']\w+)*', raw)
>>> re.findall(r"\w+(?:[-']\w+)*|'|[-.(]+|\S\w*", raw)

NLTKの正規表現トークナイザで攻める

nltk.regexp_tokenize()を利用する。 re.findall()よりも効率的に利用できる。

>>> nltk.regexp_tokenize(text, pattern)