今日はPythonを使ってテキストデータの前処理を行い、その結果を可視化する方法についてまとめます。具体的には、元首相の安倍晋三氏のツイートデータを使って、その内容を分析し、ワードクラウドを作成します。データはこちらのKaggleサイトからダウンロードできます。
データの読み込みと確認
まずはデータを読み込んで、その内容を確認する。データの大きさや特定のカラムのユニークな値、カラムの一覧などを確認することで、データの全体像を把握する。
# データの大きさ
df_data.shape
# 特定カラムのユニークな値
df_data['カラム名'].unique()
# カラムの一覧
df_data.columns
# 特定カラムの内容
df_data['カラム名'].values # 省略なしの場合:df_data['カラム名'].values.tolist()
文章データに対する前処理
文章データに対して前処理を行う理由
自然言語の文章はそのままでは数値化できず、AIによる分析が難しい。そのため、形態素解析という手法を用いて文章を単語に分割し、それぞれに品詞を付与する。これにより、文章は単語の集合として扱うことができ、解析や分析が可能になる。
しかし、形態素解析だけでは不十分で、文章中の不要な記号や特殊文字などが混じっていると、それらも一つの単語として認識されてしまう。これらは通常、文章の意味を理解する上で役立たないため、前処理の過程で削除する。
置換による削除
削除の方法として一番単純なのはreplaceを使うこと。
test_string.replace('「','') # 「を削除
正規表現による削除
正規表現は文字列の集合を1つの文字で表現する方法の1つで、これを用いて特定文字の削除等に活用できる。以下は一例だが、パターンは多数あるので公式ドキュメントで確認するのがよい。
メタ文字 | 意味 | 例 | マッチする文字列 |
---|---|---|---|
. | 任意の1文字 | pyth.n | “python”, “pythOn” |
^ | 文字列の先頭 | ^py | “python”, “pycharm”, “py” |
* | 直前の文字の0回以上の繰り返し | pyt* | “py”, “pyt”, “pyttt” |
+ | 直前の文字の1回以上の繰り返し | pyt+ | “pyt”, “pythhh” |
この他にもメタ文字はたくさんあり、例えばURLを削除する場合の正規表現を調べると、一例としてhttps?://[\w/:%#$&?()~.=+-]+ というものが出てくる。慣れるまでは何を表しているかわからないので公式ドキュメント等で確認して紐解いていくことになるが、今であればChatGPTに聞いて解説してもらうのが手っ取り早そう。
正規表現をPythonで使用するにはreライブラリを用いて、re.sub(正規表現、変換後文字列、対象文字列)の形で行う。
大文字変換、小文字変換
大文字変換、小文字変変換もよく使用する。意味が同じ単語を大文字小文字が違うことによって違う単語と認識されないため。大文字変換はtest_string.upper()、小文字変換はtest_string.lower()で行う。
表記ゆれの修正
表記ゆれの修正は以下の手順で行う。
- 変換用の辞書の作成
- 正規表現パターンオブジェクトを作成(re.compile)
- 置換実施(pattern.sub)
例えば、”ABC株式会社”に関する色々な表記をすべて”ABC”に変換したい場合、以下のようにする。
# 変換用の辞書を作成。キーには元の表記、値には変換後の表記を設定する。
replacement_dict = {
'ABC株式会社':'ABC',
'(株)ABC':'ABC',
'ABC(株)':'ABC',
'エービーシー':'ABC',
'ABCホールディングス':'ABC',
'ABCテクノロジー':'ABC',
}
# 辞書のキー(元の表記)を'|'で連結して正規表現パターンを作成。'|'は正規表現で「または」を意味する。
pattern = re.compile('|'.join(replacement_dict.keys()))
# 正規表現のパターンにマッチする部分を、辞書に基づいて変換する。x.group()はマッチした文字列を取得する。
result = pattern.sub(lambda x: replacement_dict[x.group()], test_string)
カラムへの適用
これまでに出てきたものから対象データに必要な前処理を関数にまとめ、Pandasデータフレームの対象カラムに対してmapで適用する。
# 前処理用の関数設定
import re
def text_preprocessing(text):
# 「]の削除
text = text.replace('「','')
text = text.replace('」','')
# URLの削除
text = re.sub(r'https?://[\w/:%#\<pre wp-pre-tag-0=""></pre>amp;\?\(\)~\.=\+\-]+', '', text)
# 小文字の変更
text = text.lower()
return text
# 前処理実施
df_data['対象列'] = df_data['対象列'].map(text_preprocessing)
形態素解析とワードクラウドの作成
以下、前処理が終わったテキストデータに対して、形態素解析を行いワードクラウドを作成していく。
MeCabを用いた形態素解析
分かち書きの説明とコード例
分かち書き(言葉のくぎりに空白をいれる書きかたのこと)用のライブラリとしてMeCabがある。パーサーを設定して→形態素解析を実行という流れだが、ソースを見た方が早い。
# ライブラリのインポート
import MeCab
# 分かち書き用のパーサーの設定
tagger = MeCab.Tagger("-Owakati")
# 文言の設定
test_string = "すもももももももものうち"
# 文言の形態素解析
print(tagger.parse(test_string))
上記を実行すると「すもも も もも も もも の うち」が表示される。
形態素解析の説明とコード例
先ほどのパーサーを「-Ochasen」に変えるだけで形態素解析が可能。以下のコードのように形態素解析をしてくれる。
# ライブラリのインポート
import MeCab
# 形態素解析用のパーサーの設定
tagger = MeCab.Tagger("-Ochasen")
# 文言の設定
test_string = "すもももももももものうち"
# 文言の形態素解析
print(tagger.parse(test_string))
出力は以下の通りで、きれいに品詞に分解してくれており、結果も正しい。
品詞を利用したストップワード除去
ストップワードとは「です」「ます」「それ」などのような、文章の中でよく使われるけれども、その文章が何について述べているのかを理解するのにはあまり役に立たない単語。
この「役に立たない」かどうかを「品詞」で分類して助詞、助動詞などを省いていく。
具体的な手順は、先ほどの形態素解析のパーサーで「parseToNode」という関数を利用して品詞を判断し、特定の品詞の場合のみ単語として登録していく。
以下は名詞と形容詞のみを抜き出した例。
text = "私は形態素解析について勉強中です。MeCabライブラリはとても便利で役に立っています。"
# ライブラリのインポート
import MeCab
# 形態素解析用のパーサーの設定
tagger = MeCab.Tagger("-Ochasen")
# nodeの作成
node = tagger.parseToNode(text)
word = ''
while node:
# node.feature.split(",")[0]で品詞情報を取得
hinshi = node.feature.split(",")[0]
# 品詞が名詞または形容詞の場合
if hinshi in ["名詞","形容詞"]:
# node.surfaceで表層形(単語そのもの)を取得
origin = node.surface
# 単語をwordに追加
word = word + " " + origin
# 次のnodeに移動
node = node.next
print(word)
出力結果は「私 形態素 解析 勉強 中 MeCab ライブラリ 便利」となり、指定通りに名詞と形容詞のみの抜粋に成功。
ワードクラウドの作成
wordcloudというライブラリのWordCloudというモジュールを使用。
WordCloud()にてインスタンスを作成後、.generate()メソッドにてワードクラウドを作成する。その後、matplotlibのpyplotを使用して表示する。
# ライブラリのインポート
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# ワードクラウドの作成
wordcloud = WordCloud(background_color="white",
font_path=r"C:\Windows\Fonts\MSGOTHIC.TTC",
width=600, height=400, min_font_size=10).generate(word)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
これで変数”word”に格納された文字についてワードクラウドを作成する。冒頭の安倍元首相のツイートを元に作成したワードクラウドは以下のようになる。
なお、作成の過程でIPAフォントを使おうとしたらなかなかうまくいかなったので、対応記事にしています。同じように行き詰ったらご参考にしてください。
WordCloudについて学習していた際に、サンプルコードを実行したところエラーが発生しました。その解決方法を共有します。 1.目的のコード 以下がそのサンプルコードです。 なお、読み込み対象としているテキストは安倍元首[…]
以上、テキストデータの前処理と可視化についてまとめました。今回はワードクラウドの作成をゴールにしましたが、形態素解析は各種分析に必須となりそうなので今後も適宜情報を補足していきます。