Stanford大学の自然言語処理講座(1-3)正規表現 〜実践編〜


みなさまこんにちは。藤井です。
自然言語処理のStanford大学の講座シリーズをお届けいたします。
今回は、Week1 Regular Expression in Practical NLP
正規表現を使って、自然言語の様々な種類の実用的かつ可能な指定方法を学びます。

例えば、月は?曜日は?人の敬称は?それらを一括で選択する方法は?
お忘れになっている方は、前の講義のブログを参照してください。

月の指定:1月〜12月までを指定する
MONTH = Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec
曜日の指定:月〜金曜日までを指定する
DAYS = Mon|Tue|Tues|Wed|Thu|Thurs|Fri
敬称の指定:MrやDrを指定する
TITLE = Mr|Mrs|Ms|Miss|Drs?|Profs?|Sens?|Reps?|Attys?
「|」パイプでつないだものは、そのいずれか、を表します。
「?」は、一つ前の文字があるか、もしくはない、を表します。
(ちなみにProfは先生(教授)、Senは議員(←多分…)、Repは代表、Attyは牧師さんへの敬称です。)
次に、少し複雑なものを。

電話番号を指定する
PHONE = (\([0-9]{2,3}\)[ \u00A0]?|(\+\+?)?([0-9]{2,4}[\- \u00A0])?[0-9]{2,4}[\- \u00A0])[0-9]{3,4}[\- \u00A0]?[0-9]{3,5}|((\+\+?)?[0-9]{2,4}\.)?[0-9]{2,4}\.[0-9]{3,4}\.[0-9]{3,5}

黄色のところが国番号。
PHONE = (\([0-9]{2,3}\)[ \u00A0]?|(\+\+?)?([0-9]{2,4}[\- \u00A0])?[0-9]{2,4}[\- \u00A0])[0-9]{3,4}[\- \u00A0]?[0-9]{3,5}|((\+\+?)?[0-9]{2,4}\.)?[0-9]{2,4}\.[0-9]{3,4}\.[0-9]{3,5}
0から9までの数字が、2〜4桁という意味です。

黄色のところがエリアコード。
PHONE = (\([0-9]{2,3}\)[ \u00A0]?|(\+\+?)?([0-9]{2,4}[\- \u00A0])?[0-9]{2,4}[\- \u00A0])[0-9]{3,4}[\- \u00A0]?[0-9]{3,5}|((\+\+?)?[0-9]{2,4}\.)?[0-9]{2,4}\.[0-9]{3,4}\.[0-9]{3,5}
0から9までの数字が、3〜4桁という意味です。

黄色のところが地域の電話番号。
PHONE = (\([0-9]{2,3}\)[ \u00A0]?|(\+\+?)?([0-9]{2,4}[\- \u00A0])?[0-9]{2,4}[\- \u00A0])[0-9]{3,4}[\- \u00A0]?[0-9]{3,5}|((\+\+?)?[0-9]{2,4}\.)?[0-9]{2,4}\.[0-9]{3,4}\.[0-9]{3,5}
0から9までの数字が、3〜5桁という意味です。

では、黄色の「」より左の部分を見てみると…
PHONE = (\([0-9]{2,3}\)[ \u00A0]?|(\+\+?)?([0-9]{2,4}[ - \u00A0])?[0-9]{2,4}[\- \u00A0])[0-9]{3,4}[\- \u00A0]?[0-9]{3,5}|((\+\+?)?[0-9]{2,4}\.)?[0-9]{2,4}\.[0-9]{3,4}\.[0-9]{3,5}

よくみると、左側は [\- \u00A0]が付いているだけの違いです。

u00A0とは、スペースの意味です。
例えば、ダミーですが、エジプト(国番号20)の 212-700-7000の電話番号を抽出したいとき。
国番号があったりなかったり、700-7000とハイフンや、700 7000と空白や、700.7000とピリオドなど、様々な書かれ方をしているでしょう。
上に挙げた正規表現で
左側で
++20 212  700 7000
+20 212 700 7000
20 212 700 7000
212 700 7000
++20-212-700-7000
+20-212-700-7000
212-700-7000
(212)700-7000
など
右側で
++20.212.700.7000
+20.212.700.7000
20.212.700.7000
212.700.7000
などと書いてあるものを選択できる、というワケです!

一見呪文のように見えますが、1つずつ噛み砕いていくと意味がわかってくると思います!
次回はWord Tokenizationです。乞うご期待。


This entry was posted in 自然言語処理(NLP) and tagged , , . Bookmark the permalink.