Twitterの字句解析で余分な文字列を削除する正規表現について

2021-05-09

はじめに

GWが終わり日本中の人たちが悲しみにくれています。 例にもれず私も悲しみ、悲しさのあまりゾンビランドサガの1期と2期の放送分を全て見ました。 ゾンビってのは通電したら、プロジェクトマッピングのような演出ができるんですね。腹抱えて爆笑ですよ。

ツイートデータはあまりにゴミが多すぎる

Twitterの文書にはゴミが多数含まれています。 少なくともワイのツイートにはゴミ記号が多く含まれており、実行時にエラーの原因となることもありました。 Tweetデータの形態素解析に不要な記号を削除する正規表現について考えていきます。

15万ツイートのツイートには実に様々な文字列が含まれています。

 ゴミの例

  • (´・ω・`) 昔流行りましたね。こいつに含まれる「`」や「()」がプログラムに取り込むと良く別の意味で捉えられてしまうので消しておきたいですね。

  • ヽ( ・∀・)ノ┌┛ HTMLの実態参照が必要な文字が含まれているものは怪しいですね。 例えば、<のように展開されます。使い方にもよりますがコマンドプロンプトの引数にわたす場合、&や;が含まれているのは都合が悪いです。

実装例

英数字、日本語(漢字・カタカナ・ひらがな)と限られた記号以外消せば良いのではないかということで削除していきます。

正規表現での削除例

[^0-9A-Za-z\p{Hiragana}\p{Katakana}\p{Han}#@\$\%\!\?\.\,、。ωΩΦ:\-ー]

ツイートでよく使われていそうな文字列以外を削除するためにこの正規表現を使用します。

正規表現 意味
[0-9A-Z-a-z] 英語(大文字・小文字)数字
\p{Hiragana} ひらがな。
\p{Katakana} カタカナ。
\p{Han} 漢字
^ 以外のマッチング(例:^0-9だと数字以外がマッチします。)

その他記号は使いそうなものに\をつけて削除しないものを指定していきます。

\p{*} というのは、Unicodeスクリプトです。 PerlやGolangでは使用することができるのでこちらを使い変換します。

Unicodeスクリプトが使えるのであれば楽でいいですね。

golangの記述例

    com := regexp.MustCompile(`[^0-9A-Za-z\p{Hiragana}\p{Katakana}\p{Han}#@\$\%\!\?\.\,、。ωΩΦ:\-ー]`)
    str = com.ReplaceAllString(str, "")

まとめ

正規表現は便利ですよね。 Golangで正規表現を使うと遅いと言われていますが、一回使う文にはさほど気にならない速度だと思います。

分からんことばかりですね。Tweetの全文に対し形態素解析する処理をかけようとすると随分時間がかかるコードになっていたので修正しないといけないですね。