LoginSignup
77

More than 1 year has passed since last update.

posted at

updated at

テキスト前処理と可視化が楽チンな『Texthero』使ってみた

はじめに

テキストデータの前処理や可視化を簡単に行うことができるTextheroを使ってみたので、使い方をまとめました。

目次

Textheroとは

texthero(テキストヒーロー)」とは、テキストデータの前処理やベクトル化、表現および可視化を行うことができるオープンソースのライブラリです。
非常に新しいライブラリで、現在β版としてリリースされています(2021/03/09時点)。

Pythonによる数行の簡単な実装で、様々な自然言語処理のタスクを行うことが可能です。

今回は、使い方を学ぶという目的で、英語を対象にテキスト解析してみます。
※公式ページによると、今後日本語をはじめ多言語に対応予定とのことです。

Textheroの使い方

※以下、言語はPython、環境はGoogle Colaboratoryを使用します。ご自身の環境に合わせて、適宜読み替えて下さい。

それでは早速Textheroを使ってみましょう。
pipでインストールします。

pip install texthero

あとはインポートするだけです。
pandasも使用するので、併せてインポートしておきます。

import texthero as hero
import pandas as pd

前処理

ではまず、前処理をやってみます。
以下の文字列を扱ってみましょう。pandasでSeriesとして用意しておきます。

row_text = "    Hi! I've started kàgglé,   and I'm enjoying."
s = pd.Series(row_text)

Textheroを使用すれば、不要なスペースの削除、大文字・小文字をどちらかに統一、ストップワード(注釈)の除去、といったことが簡単にできます。
以下、いくつかの前処理を行ってみました。

s = hero.remove_whitespace(s) # スペースの削除
print(s)
s = hero.remove_diacritics(s) # ダイアクリティカルマーク(発音区別符号。àやéなど)の削除
print(s)
s = hero.lowercase(s) # 小文字への統一
print(s)
s = hero.remove_punctuation(s) # 句読点の削除
print(s)
s = hero.remove_stopwords(s) # ストップワードの削除
print(s)

# 0    Hi! I've started kàgglé, and I'm enjoying.
# dtype: object
# 0    Hi! I've started kaggle, and I'm enjoying.
# dtype: object
# 0    hi! i've started kaggle, and i'm enjoying.
# dtype: object
# 0    hi  i ve started kaggle  and i m enjoying 
# dtype: object
# 0    hi    started kaggle     enjoying 
# dtype: object

ちなみに、特に引数を指定せずにcleanを使用することで、いい感じに色々な前処理を行ってくれます。

dirty_text = "    Hi! I've started kàgglé,   and I'm enjoying."
s = pd.Series(dirty_text)

hero.clean(s)
# 0    hi started kaggle enjoying
# dtype: object

可視化

Textheroでは、データを可視化することもできます。

データの準備

まずは可視化するデータを準備します。今回、公式ページと同様、BBCスポーツのデータを扱ってみます。
pandasを使用して、dataframeとして読み込んでおきます。

df = pd.read_csv(
   "https://github.com/jbesomi/texthero/raw/master/dataset/bbcsport.csv"
)

Dataframe dfの中身は以下のようになっています。
image.png

少しわかりにくいので、df.to_csv('tmp.csv')などとしてcsvファイルにし、エクセル等で開いて中身を確認してみましょう。
textとtopicというカラムがあり、あるtopic(athletics(陸上競技)やtennisなど)に対するtext(記事)が記載されているようです。

image.png

word cloud

それでは、word cloud(ワードクラウド)を描いてみます。word cloudは、頻出の単語ほど大きく表示するものです。

word cloudは、visualization.wordcloudで表示することができます。
欠損値の除外(fillna)のみ前処理を行ったテキストデータを可視化してみます。

raw_text = df['text']

clean_text = hero.clean(raw_text, pipeline=[
    hero.preprocessing.fillna,
])
hero.visualization.wordcloud(clean_text, colormap='viridis', width=500, height=400, background_color='White')

image.png

word cloudを表示することができました。

結果を見ると、「the」「in」「to」など、重要ではない単語が多く表示されています。
ストップワードを除外する処理を入れたほうがよさそうです。
併せてその他の前処理も行い、再度word cloudを表示してみます。

clean_text = hero.clean(raw_text, pipeline=[
    hero.preprocessing.fillna,
    hero.preprocessing.lowercase,
    hero.preprocessing.remove_digits,
    hero.preprocessing.remove_punctuation,
    hero.preprocessing.remove_diacritics,
    hero.preprocessing.remove_stopwords # ストップワードの除去
])
hero.visualization.wordcloud(clean_text, colormap='viridis', width=500, height=400, background_color='White')

image.png

ストップワードが取り除かれていることが確認できます。

※日本語のword cloudについては、以下の記事をご参考下さい。

散布図

Textheroでは、単語をベクトル化した散布図を描くこともできます。

今回、データに対して以下の処理を行います。

  • 前処理
  • tf-idf(注釈)による単語の重要度の計算
  • PCA(注釈)による次元削減
  • k近傍法(注釈)による分類
df['tfidf'] = (
    df['text']
    .pipe(hero.clean)
    .pipe(hero.tfidf)
)
df['pca'] = df['tfidf'].pipe(hero.pca)
df['kmeans_labels'] = (
    df['tfidf']
    .pipe(hero.kmeans, n_clusters=5)
    .astype(str)
)

処理後のDataframeである df は以下のようになっています。

image.png

それでは、この結果を散布図としてプロットしてみます。
topicごとの分類およびk近傍法による分類の2つを表示してみます。

image.png

散布図を表示することができました。

図を見ると、k近傍法による分類が、トピックごとに分けたものと非常に近いことがわかります。

注釈

  • ストップワードとは、自然言語処理において分析対象から除外される単語のことです。日本語では、「は」「の」「です」など、英語では「a」「the」「of」などは頻繁に用いられますが、あまりに一般的な単語で分析対象としない場合が多く、その場合前処理などで除外することになります。
  • tf-idfとは、文書中に含まれる単語の重要度を評価する手法の1つです。tf(Term Frequency、単語の出現頻度)とidf(Inverse Document Frequency、逆文書頻度)の積で表されます。
  • PCA(Principal Component Analysis)とは、主成分分析とも呼ばれ、多変量解析の手法の1つです。互いに相関のあるデータの集まりの中から、データのばらつきである分散が大きい「主成分」を見つける際に利用されます。また、本記事のように多次元のベクトルを可視化する際に、次元削減のために使用されることもあります。
  • k近傍法(k-nearest neighbor, k-NN)とは、多クラス分類で用いられる手法の1つです。ベクトル空間上にデータが存在しているとき、未知のデータに対して、既存のデータのなかから距離的に近いK個のデータを取得し、多数決によってどのクラスに属するかを推定します。

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
77