rohaniのブログ

ゆるっと自然言語処理奴。ときどき工作系バイト。

re 〜正規表現を用いて検索・置換〜

用途

正規表現を用いて検索や置換を行うとき。

(私の場合、大量のデータに一括で置換処理を施したいときは、linuxコマンドsedを使うことが多い。 少量のデータに一括で置換処理を施したいときは、経過が観やすいvim:%sを使うことが多い。)

インポート

import re

Pythonの標準モジュールなのでpip installなどをする必要はない。

置換を用いてツイートの正規化を行う例

要件

  • ツイートから正規表現で特定の文字列を見つけ、置換したい。
  • 置換対象の文字列と置換先の文字列は1対1対応で、複数ある。
    • リプライ先のユーザ名 → 削除
    • なんらかのURL→<URL>タグ
    • なんらかのユーザ名→<NAME>タグ
    • なんらかの数字→<NAM>タグ
  • 1行1ツイートで保存されている

繰り返し同じパターンの検索を行うので、コンパイルを行うことにする。

import re

# 置換対象と置換先の設定
patterns = [['^(@[a-zA-Z0-9_]+ )+', ''],
                    ['https?://[¥w/:%#¥$¥?¥(¥)~¥.=¥+¥-]+]', '<URL>'],
                    ['@[a-zA-Z0-9_]+', '<NAME>'],
                    ['[0-9]+','<NUM>']
                   ]

repatterns = [re.compile(pattern[-1]) for pattern in patterns]

tweets = []
with open('tweets.list', 'r') as f:
    tweets = f.read().split('¥n')[:-1]

new_tweets = []
for tweet in tweets:
    for (idx, repattern) in enumerate(repatter):
        tweet = repattern.sub(patterns[idx][1], tweet)
    new_tweets.append(tweet)

検索を用いてMeCab出力結果から特定の品詞の単語表層系のみ抜き出す例

mecabの出力結果を与えると、特定の品詞の単語だけ抜き出した分かち書き文に変換してくれるプログラム。

要件

  • 特定の文字列を含む行を正規表現で見つけ、抜き出したい。
  • 対象の文字列は複数ある。
    • 名詞
    • 形容詞
  • 1行は表層系¥tカンマ区切りの品詞情報となっている。(MeCab標準の出力)

繰り返し同じパターンの検索を行うので、コンパイルを行うことにする。

import re

# 抜き出す対象の設定
patterns = ['^名詞,', '^形容詞, ']

repatterns = [re.compile(pattern) for pattern in patterns]

mecabouts = []
with open('tweets.list', 'r') as f:
    mecabouts = [x.split('¥t') for x in f.read().split('¥n')[:-1]]

wordstrings = ['']
for mecabout in mecabouts:
    if len(mecabout)==2:
        surface, pos = mecabout[0], mecabout[1]
        if len([1 for repattern in repatterns if repattern.search(pos)])>0:
            wordstrings[-1] = wordstrings[-1] + surface + ' '
    else: #EOS
        if len(wordstrings[-1])>0:
            wordstrings[-1] = wordstrings[-1][:-1]  #末尾の空白を削除
        wordstrings.append('')
wordstrings = wordstrings[:-1]

参考