テキストデータに対しての前処理
〇データの確認
・columnを調べる。 → df.columns
・ユニークな値を確認→ df.[ ].unique( )
・データの大きさ → df.shape
〇テキストデータの内容を確認する。
In [1]: # ライブラリのインポート
import pandas as pd
# データの読み込み
df_data = pd.read_csv('Shinzo Abe Tweet 20171024 - Tweet.csv')
df_data['Tweet Text Size Block'].values
Out[1]: array(['選挙期間中、自民党の候補者たちは全国各地で我々の経済政策を、安全保障を、そして日本の将来を担っていく決意と地域を支える想いを皆様に訴えかけさせていただきました。
「この国を、守り抜く。」自民党はこれからも皆様とともに歩みを進めて参ります。本当に12日間ご声援ありがとうございました。https://twitter.com/jimin_koho/status/921744056987693057 …',
'外国人旅行者数はこの5年間で3倍になりました。自民党は高次元での観光資源施策に取り組み我が国の伝統文化財等の国内観光資源の強化を図り、さらに観光産業の活性化を実現して参ります。pic.twitter.com/EMNDcADrYB',
'明日10月21日(土) 安倍晋三総裁は岐阜県、愛知県、東京都に参ります。 詳細は是非、自民党の特設サイトでご確認下さい。https://special.jimin.jp/',
・・・
'秒速8キロで宇宙空間を飛びながら、「こうのとり」をキャッチした油井宇宙飛行士。チームジャパンの中心として、日本の宇宙技術の高さを世界に示してくれました。宇宙から撮影した富士山の写真をいただき、早速執務室に飾らせていただきました。pic.twitter.com/ZFPYeem18c'],
dtype=object)
.values → 辞書型のデータのみを出力。
〇前処理後の目的設定
最終的にデータを使って何をするのかを明確に決めておくことも重要。
データの可視化を行い。目的を決める。
〇テキストデータの可視化(Wordクラウド)
文章中で出現頻度が高い単語を複数選び出し、その頻度に応じた大きさで図示する手法となる。
・大きさ
・色
・字体
に変化をつけることで一目で差別化する。
〇文書データに前処理を行う理由
自然言語の世界では、テキストデータを文そのままをとして用いずに、単語の集まり(集合)として解析、分析することが非常に多いです。
というのも文のままでは数値化できず、システム(AI)に取り込むことが難しいからです。
〇形態素解析
文法ルールや辞書データに基づいて会話や文章を単語に分割し、それぞれに品詞を付与する処理。
例1)すもももももももものうち
例②)「すもも」もももももものうち
この解析をするには、解析の邪魔になる不要な記号の削除が必要になる。
〇不要な記号の削除【replasce, translate】
『replace(置換元文字列, 置換先文字列 )』
In [2]: test_string = '「ミス日本コンテスト」は、1950年に第1回が開催された歴史ある大会です。'
print(test_string.replace('」','').replace('「',''))
Out[2]: ミス日本コンテストは、1950年に第1回が開催された歴史ある大会です。
※「 と 」がを消去するように置換されている。
※例のようにreplace関数を複数回使うことも可能。
『translate( )』
In [3]: test_string = 'SIGNATEは、データサイエンティスト・MLエンジニアのためのコミュニティです。'
print(test_string.translate(str.maketrans({'、': ',','。': '.','・': '',})))
Out[3]: SIGNATEは,データサイエンティストMLエンジニアのためのコミュニティです.
※replaceは1つずつしか呼べないが、translateは複数を一度に置換。
※変換テーブルは、『str.maketrans()』で作成。
→引数として、変換前の文字と変換後の文字のマップを指定。
〇不要な記号の削除【正規表現1】
【正規表現とは】
・文字列の集合を1つの文字列で表現する方法の1つ。
・正規表現を使用して、文字列のパターン化した文字列に置き換えることで、文字列の検索や置き換えなど幅広い処理を行うことが出来る。
・正規表現で使われる記号をメタ文字と呼び、以下のような種類がある。
【積域表現チェッカー】
https://weblabo.oscasierra.net/tools/regex/
〇不要な記号の削除【正規表現の方法】
・『re』というライブラリを用いる。
『re.sub(①正規表現, ②置換後の文字列, ③置換対象の文字列)』
※①の正規表現を用いる際に頭に『r』をつける!
# ライブラリのインポート
import re
test_string = '詳細は是非、自民党の特設サイトでご確認下さい。https://special.jimin.jp/'
# URLの削除
print(re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', '', test_string))
test_string2 = '夢や希望を持てる「農政新時代」を切り拓きます。pic.twitter.com/Fp0IqNYTSk'
# pic.twitter.XXXの削除
print(re.sub(r'pic.twitter.com/[\w/:%#$&?()~.=+-]+', '', test_string2))
〇大文字から小文字への変換
AIや機械学習は大文字と小文字の違いによって同じ意味であるにもかかわらず、別の単語としてとらえられてしまう。
それを回避するために大文字を小文字に返納しておく必要がある。
『lower( )』:小文字への変更
In [1]: test_string = 'This is a apple.'
print(test_string.lower())
Out[1]: this is a apple.
『upper( )』:大文字への変更
In [2]: test_string = 'This is a apple.'
print(test_string.upper())
Out[2]: THIS IS A APPLE.
〇表記ゆれに対しての名寄せ
(表記ゆれ例)
1.「株式会社」の有無による表記ゆれ
・SIGNATE
・SIGNATE株式会社
・(株)SIGNATE
・SIGNATE(株)
2.「・」の有無表記ゆれ
・コカ・コーラ
・コカコーラ
3.英語表記かカタカナ表記か
・シグネイト
・SIGNATE
4.詳細企業名か、大本企業名かによる部分一致
・SIGNATEホールディングス
・SIGNATEテクノロジー
【このような表記ゆれを統一化していく!】
①名寄せ用の置換辞書を作成。
replacement_dict = {
'SIGNATE株式会社':'SIGNATE',
'(株)SIGNATE':'SIGNATE',
'SIGNATE(株)':'SIGNATE',
'コカ・コーラ':'コカコーラ',
'シグネイト':'SIGNATE',
'SIGNATEホールディングス':'SIGNATE',
'SIGNATEテクノロジー':'SIGNATE',
}
②正規表現パターンオブジェクトを作成。
『re.compile( )』:正規表現パターン文字列をコンパイルして積表演パターンオブジェクトを作成。
In [1]: # ライブラリのインポート
import re
# 正規表現パターンを置換用辞書を元に作成
pattern = re.compile('|'.join(replacement_dict.keys()))
pattern
Out[1]: re.compile(r'SIGNATE株式会社|(株)SIGNATE|SIGNATE(株)|コカ・コーラ|シグネイト|SIGNATEホールディングス|SIGNATEテクノロジー',re.UNICODE)
test_string = 'SIGNATEテクノロジーはコカ・コーラと協力し、シグネイトコカコーラコンペを開催した'
『.sub』を用いて置換を行う。
In [2]: result = pattern.sub(lambda x: replacement_dict[x.group()], test_string)
result
Out[2]: SIGNATEはコカコーラと協力し、SIGNATEコカコーラコンペを開催した
・マッチした文字列を取得: group()
〇今までの前処理の実施と文章の集約
# ライブラリのインポート
import pandas as pd
# データの読み込み
df_data = pd.read_csv('Shinzo Abe Tweet 20171024 - Tweet.csv')
# ライブラリのインポート
import re
def text_preprocessing(text):
# 「]の削除
text = text.replace('「','')
text = text.replace('」','')
# URLの削除
text = re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', '', text)
# pic.twitter.comXXXの削除
text = re.sub(r'pic.twitter.com/[\w/:%#\$&\?\(\)~\.=\+\-]+', '', text)
# 小文字の変更
text = text.lower()
return text
カラムTweet Text Size Blockに対して前処理をかけ、処理後の結果をカラムClearned Tweet Text Size Blockに代入。
df_data['Clearned Tweet Text Size Block'] = df_data['Tweet Text Size Block'].map(text_preprocessing)
また、今回は安倍晋三さんのツイートに限定して、ワードクラウドを作成したいので、カラムFull Name Showが安倍晋三となっているデータに限定しましょう。
df_data = df_data[df_data['Full Name Show']=='安倍晋三']
現状はレコードごとにデータを管理していますが、この中からTweet Text Size Blockの内容を集約しましょう。
pandasのデータを集約する際は.sum()を用います。.sum()はカラムの要素が数値の場合は数値の合計を、カラムの要素が文字列であれば1つに集約した文字列を返します。
レコードの形 → tweetの集まりの形(tweetのみ集約した形)
all_tweet_data = df_data['Clearned Tweet Text Size Block'].sum()
〇分かち書き【MeCab】
【分かち書きとは】
言葉のくぎりに空白をいれる書き方。
【パーサーとは】
自然言語で、1つの文章を分野単語に分解してくれるプログラム。
『MeCab.tagger( )』:分かち書き
・引数 -Owakati:分かち書き用のパーサーになる。
# ライブラリのインポート
import MeCab
# 分かち書き用のパーサーの設定
tagger = MeCab.Tagger("-Owakati")
『.parse( 分かち書きを行いたい文章)』
→分かち書きを行いたい文章を指定。
例1)
In [1]: test_string = '「すもも」もももももものうち'
print(tagger.parse(test_string))
Out[1]: 「 すもも 」 もも も もも も の うち
例2)
In [2]: test_string1 = 'すももの木が裏庭にあり、ももの木は玄関先にある。'
print(tagger.parse(test_string1))
Out[2]: すもも の 木 が 裏庭 に あり 、 もも の 木 は 玄関 先 に ある 。
〇形態素分析(MeCab)
→文法ルールや辞書データに基づいて会話や文章を単語に分割し、それぞれに品詞を付与する処理。
【方法】
→プログラムのパーサーの引数を『-Chasen』に変更。
In [1]: # ライブラリのインポート
import MeCab
# 形態素解析のパーサーの設定
tagger = MeCab.Tagger("-Ochasen")
# 例文
test_string = '「すもも」もももももものうち'
# 形態素解析
print(tagger.parse(test_string))
Out[1]: 「 「 「 記号-括弧開
すもも スモモ すもも 名詞-一般
」 」 」 記号-括弧閉
もも モモ もも 名詞-一般
も モ も 助詞-係助詞
もも モモ もも 名詞-一般
も モ も 助詞-係助詞
の ノ の 助詞-連体化
うち ウチ うち 名詞-非自立-副詞可能
EOS
〇品詞を利用したストップWord除去
【ストップワードとは?】
→自然言語を処理するにあたって一般的であるなどの理由で処理対象外とする単語のこと。
【名詞のみに絞ってゆく!】
①データを読み読む
n [1]: # データの読み込み
f = open('all_tweet_data.txt')
# ファイル終端まで全て読んだデータを返す
text = f.read()
f.close()
text
Out[1]: "選挙期間中、自民党の候補者たちは全国各地で我々の経済政策を、安全保障を、そして日本の将来を担っていく決意と地域を支える想いを皆様に訴えかけさせていただきました。この国を、守り抜く。自民党はこれからも皆様とともに歩みを進めて参ります。本当に12日間ご声援ありがとうございました。 …外国人旅行者数はこの5年間で3倍になりました。自民党は高次元での観光資源施策に取り組み我が国の伝統文化財等の国内観光資源の強化を図り、さらに観光産業の活性化を実現して参ります。明日10月21日(土) ・・・
contest started in 1950. the winner in 1968 met my grandfather pm kishi before travelling the world before the osaka expo.ミス日本コンテストは、1950年に第1回が開催された歴史ある大会です。1968年の優勝者は、大阪万博の親善使節として世界を回る前に、私の祖父・岸信介に会ったと伺いました。日本の女性が、世界中で活躍することを応援したいと思います。一人の結果が全員に影響する、究極のチームワーク。正月の駅伝で完全優勝を果たした、青山学院大学の原監督と選手の皆さんは、優勝の感動をしみじみ語ってくれました。選手たちは礼儀正しくも、明るく自由闊達で、大いに会話が盛り上がりました。秒速8キロで宇宙空間を飛びながら、こうのとりをキャッチした油井宇宙飛行士。チームジャパンの中心として、日本の宇宙技術の高さを世界に示してくれました。宇宙から撮影した富士山の写真をいただき、早速執務室に飾らせていただきました。"
②形態素解析のために『MeCab』をインポートし、
# ライブラリのインポート
import MeCab
# 形態素解析用のパーサーの設定
tagger = MeCab.Tagger("-Ochasen")
③parseToNode( )
In [2]: node = tagger.parseToNode(text)
while node:
print(node.surface)
print(node.feature)
node = node.next
Out[2]: 選挙
名詞,サ変接続,*,*,*,*,選挙,センキョ,センキョ
期間
・・・
各地
名詞,一般,*,*,*,*,各地,カクチ,カクチ
1.parseToNode( )で最初のnodeを得る。
2.「node.feature」「node.surface」でそれぞれの単語の特徴を出力。
3.node.nextで次のnodeに移る。(2→3を繰り返す。)
➃③で出力した品詞のみを抽出。
In [3]: word = ''
while node:
hinshi = node.feature.split(",")[0]
if hinshi in ["名詞"]:
origin = node.surface
word = word + " " + origin
node = node.next
word
1.『.split( )』:引数の文字で分割。
2.分割した要素の0番目のみを抽出。(品詞を抽出)
3.(if)抽出した品詞が名詞の時、
→『node.feature』で対象の単語を抽出。
→受け皿の「word」に足し合わせる。
4.次のnodeへ
〇ワードクラウドの作成【WordCloud()】
【WordCloud()でよく使う引数】
・引数background_color: ワードクラウドの背景色
・引数font_path: ワードクラウド作画時のフォント
・引数width:幅
・引数height:高さ
・引数min_font_size: 最小のフォントサイズ
【手順】
①名詞を抽出。
②ライブラリをインポート
③インスタンスを作成
➃Wordクラウドの作成
⑤Wordクラウドの表示
In [1]: # ライブラリのインポート
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# インスタンス作成
wordcloud = WordCloud(background_color="white",
font_path='ipag.ttc',
width=600,
height=400,
min_font_size=10)
# ワードクラウドの作成
wordcloud.generate(word)
# ワードクラウドの表示
plt.imshow(wordcloud)
plt.show()
この記事が気に入ったらサポートをしてみませんか?