Pythonでテキストクレンジングする方法とコード紹介

※記事内に広告が含まれる場合があります。
Pythonからアクセスのマクロを自動実行 テクノロジー
スポンサーリンク

データを利用した分析や類似度などを算出する時に事前にデータをクレンジングし綺麗な状況に変えることで精度を上げることができます。

今回はクレンジングする基本処理のいくつかをご紹介することでデータ加工に慣れていただくことを目的にしております。

スポンサーリンク

Pythonから正規表現でクレンジング

メリット

正規表現のは少ないコード数でバラエティ豊かな検索条件を指定できます。

つまりクレンジングする時に登録する数を少なくできるのでメンテナンスが楽です。多くのキーワードが積み重なっており膨大になった結果全体が重くなるということのリスクも削減できます。

デメリット

正規表現は正直難しいので技術力のアイディア力が必要となります。また、色々なものが検索できる一方処理が重くなります。

そこで今回はPythonを始めたばかりの方でも使いやすいものを紹介致します。

Pythonからで正規表現を利用するには

reモジュールを利用します。reモジュールはPython標準モジュールですので既にインストールされていると思います。

最初に下記コマンドでreモジュールを読み込みます。

import re

もしpipインストールできない場合は対策方法を過去記事のPythonのpip installが使えない時のプロキシとSSL無視に記載しておりますのでご覧くださいませ。

正規表現の実例

対象ワードをそのまま書く場合 r”(黄色|イエロー)” 

任意のキーワードを複数利用して対象テキストに目的の処理を実行する方法でorは|と同じ意味です。

今回はクレンジングの話なので
「黄色とイエロー」の2語が対象テキストに含まれていたら削除する処理を記述します。

text_ = "黄色とイエローの服です"

#正規表現のorパターンを作成
pattern = re.compile(r'(黄色|イエロー)')

#正規表現ワードがあったら対象テキストを削除する処理
re.sub(pattern,"",text_)

結果をみると‘との服です’がかえってきたと思います。”黄色とイエローの服です。”から黄色とイエローが削除されたかと思います。

re.sub(pattern,””,text_)のところですが
re.sub(正規表現のパターンを記載,置換後のワード,対象テキスト)のルールで処理されるので置換後のワードを””←何もなしにすることで削除しました。

対象ワードを変数にいれる場合 (r”黄色”,r”イエロー”)

正規表現ワードがある程度多い場合は変数に格納したいと思いますのでその書き方です。

joinを利用して変数に入れたワードを|形式で連結させました。

reg_words = (r"黄色",r"イエロー")

pattern = re.compile("(" + "|".join(reg_words) + ")")

re.sub(pattern,"",text_)

出力結果は先程の同じです。

エクセルやcsvから対象ワードを読み込む

対象ワードが多ければエクセルやcsvにワードを登録しておいて読み込ませたい時は下記

df1_ = pd.read_excel("除外ワードがあるエクセルpath")

pattern = "|".join(df1_["除外ワードを登録したエクセルの項目名"].dropna(how="all").values.tolist())

re.sub(pattern,"",text_)

出力結果は先程の同じです。

少し特殊な正規表現を紹介

上記のor以外にも多数の正規表現がありますのでいくつかここでご紹介致します。

#あ~ん の全てのワードを削除します。
re.sub("[ぁ-ん]","",text_)
#'黄色イエロー服'

#最後の文字があ~んなら最後の1文字を削除します
re.sub("[ぁ-ん]$","",text_)
#'黄色とイエローの服で'

#最後の文字があ~んなら最後の2文字を削除します
re.sub("[ぁ-ん]{2}$","",text_)
#'黄色とイエローの服'

#数字を0に置き換える
re.sub("\d+","0",text_)

#数値や記号など考えられるものが3文字連続であれば置き換える。
re.sub("^[0-9a-zA-z!-/:@\[-`{-~-]{3,}$","",text_)

replaceで置換処理

正規表現が難しそうに感じた方はreplaceで置換が簡単にできます。

text_ = "黄色とイエローの服です"

text_.replace("黄色","ブルー")
#=>ブルーとイエローの服です

変換したいワードが複数ある場合は下記のようにつなげます。

text_.replace("黄色","ブルー").replace("服","洋服").replace("です","ございます")
#=>ブルーとイエローの洋服ございます

Pythonで全角半角統合処理

zenhan

全角と半角が混在しているとテキスト同士の類似度算出などで差がでてしまうので文字形式を統一する必要がある。

Pythonには全角と半角をあわせるzenhanライブラリがpipで提供されているのでインストールする

pip install zenhan

最初にimport文を書いてライブラリを読み込んでおく

imoprt zenhan

zenhanの書き方とmodeの説明を下記にて行います。

text_ = "aaaaaaキイロキイロ111111"

#mode選択なしは全て半角変換 mode=7と同じ
zenhan.z2h(text_)
#→'aaaaaaキイロキイロ111111'

##modeごとの説明
#英字を半角に
zenhan.z2h(text_,mode=1)
#→'aaaaaaキイロキイロ111111'

#数字を半角に
zenhan.z2h(text_,mode=2)
#→'aaaaaaキイロキイロ111111'

#英字と数字を半角に
zenhan.z2h(text_,mode=3)
#→'aaaaaaキイロキイロ111111'

#かなを半角に
zenhan.z2h(text_,mode=4)
#→'aaaaaaキイロキイロ111111'

#かなと英字を半角に
zenhan.z2h(text_,mode=5)
#→'aaaaaaキイロキイロ111111'

#かなと数字を半角に
zenhan.z2h(text_,mode=6)
#→'aaaaaaキイロキイロ111111'

#かなと数字を英字を半角に
zenhan.z2h(text_,mode=7)
#→'aaaaaaキイロキイロ111111'

zenhanの公式ページリンクを貼っておきます。

jaconv

もう1つjaconvライブラリを紹介します。

pip install jaconv

最初にimport文を書いてライブラリを読み込んでおく

import jaconv

ひらがなをかなに変換できるのが大きな特徴でオプションは下記。

  • digit=True or False 数字を変換対象に含めるか
  • ascii=True or False 英字・記号を変換対象に含めるか
text_2 ="aaaaaaキイロキイロきいろ黄色111111yellowYELLOWyelloYELLO"

#z2h h2zで設定変更

#ひらがな以外を半角
print(jaconv.z2h(text_2,digit=True, ascii=True)) 
#=> aaaaaaキイロキイロきいろ黄色111111yellowYELLOWyelloYELLO

#全て大文字
print(jaconv.z2h(text_2.upper(),digit=True,ascii=True))
#=>AAAAAAキイロキイロきいろ黄色111111YELLOWYELLOWYELLOYELLO

#ひらがな以外を全角
print(jaconv.h2z(text_2,digit=True, ascii=True))
#=> aaaaaaキイロキイロきいろ黄色111111yellowYELLOWyelloYELLO

#ひらがなをカタカナに
print(jaconv.hira2kata(text_2))
#=> aaaaaaキイロキイロキイロ黄色111111yellowYELLOWyelloYELLO

jaconvの公式サイトリンクを貼っておきます。

lower・upper・capitalize・title・swapcaseで大文字小文字変換

デフォルトでPythonに入っている機能で大文字小文字変換ができます。

text_2 ="aaaaaaキイロキイロきいろ黄色111111yellowYELLOWyelloYELLO"

#すべての文字を小文字に変換
print(text_2.lower())
#=> aaaaaaキイロキイロきいろ黄色111111yellowyellowyelloyello

#全て大文字
print(text_2.upper())
#=>AAAAAAキイロキイロきいろ黄色111111YELLOWYELLOWYELLOYELLO

#1文字目大文字
print(text_2.capitalize())
#=>Aaaaaaキイロキイロきいろ黄色111111yellowyellowyelloyello

#単語頭大文字
print(text_2.title())
#=>Aaaaaaキイロキイロきいろ黄色111111Yellowyellowyelloyello

最後に

クレンジングには分かち書きなどまだいくつかの方法がございますが別記事に記載予定です。今回の記事が皆様のお役に立てればと思います。

最後に私がPythonの勉強をして入門者から中級者までにこの本1冊あれば習得できるおすすめ本記事も書いております【本1冊で】Python入門から中級までなれるおすすめ本ご興味がある方は御覧くださいませ。

タイトルとURLをコピーしました