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)