テキスト前処理の話(part1)

書いてる理由

やったこと

クローリングしてきた文章の前処理系の勉強

参考

Amazon CAPTCHA

詳細

github.com

テキストを取得したら、次はそのテキストを解析できるように前処理することが必要となる。
例えば、顔文字とか入ってたら消したいし、HTMLを取得したらタグを消したいし、などなどなどなど。 その一部への対応方法を学んだ。

def html_preprocess(html_text, strip=True):
    """ htmlのタグを全て消してtextだけ取得。 要素での改行/要素内の改行が消えるのでそこは注意。 """
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html_text, 'html.parser')
    result = soup.get_text(strip=strip)
    return result

HTMLのタグは2行で消える。マジ便利。

def hashtag_erase(text):
    """ https://regex101.com/が正規表現の確認にめちゃいい。 """
    import re
    result = re.sub(r'( # [a-zA-Zぁ-ん一-龥]+)+$', '', text)  # 文章の最後までの # a~z、A~Z、ひらがな、漢字を文字列から全て消す
    result = re.sub(r' # ([a-zA-Zぁ-ん一-龥]+) ', r'\1', result)  # 文章の途中の # a~z、A~Z、ひらがな、漢字を#だけ消す
    return result

ハッシュタグのような固定的なルールをもつ文字の削除は、re[正規表現]のモジュールで対応。
ぁ-ん: 任意のひらがなとのマッチ 一-龥: 任意の漢字のマッチ
書いてて思ったけどカタカナ忘れとる。。

def number_0_change(text):
    """ 数字を0に変えて返却 """
    import re
    # result = re.sub(r'\d+', '0', text)  # 129.01 -> 0
    result = re.sub(r'\d', '0', text)  # 129.01 -> 000.00
    return result

これは、元の書籍が非常にわかりやすく書いてくれているのですが、数字ってテキストにたくさん出てくるけど解析に利用できる意味をもつものが少ないっぽい。
例えば、1980年とかの1980は、X年前とかの情報が欲しければ利用できるけど、ポジネガみたいな判別には不要っぽいし、この数字でclassificationしたいモチベーションもあんまりケースが浮かばず。
なので数字を0にしちゃって数字が異なることによるパターンの増大を軽減する意味合いがあるっぽい。

感想

まだまだ解析には届かず。でもこういう前処理がデータ解析の4割くらいを占めてる勝手な感覚(4割がデータ準備、2割が解析[実装と結合とかそういうの抜きで])なので、じっくりやっていきたい。