新着記事一覧

IT・プログラミング Python

2024/4/21

【Python】Pythonでの自然言語処理(日本語)

こちらの記事では、自然言語処理についてまとめています。 Contents1 自然言語処理とは?2 自然言語処理の実装 自然言語処理とは? 自然言語とは、日本語や英語のような自然発生的に生まれた言語です。日常的に使用している自然言語について、言葉が持つ意味を解析し処理します。活用事例としては、チャットボット、音声認識AI、文字認識(手書き文字をカメラが認識し文字データへと変換する技術)、検索エンジン、翻訳、感情分析、文章要約などがあります。 文章の意味を機械に理解させるには、単語分割を行う必要があります。手 ...

続きを読む

IT・プログラミング Python

2024/4/8

【Python】統計学的モデル 時系列分析の実装

こちらの記事では、時系列分析の実装についてまとめています。 Contents1 時系列分析とは?2 定常性とは?3 時系列データの分析方法4 SARIMAモデルの実装 時系列分析とは? 時系列分析では、時間経過とともに変化する時系列データを扱います。時系列データの例としては、毎時間の気温、株価の推移等がこれにあたります。売上予測、来店者予測等、ビジネスにおいて重要な分析技術です。 時系列データには以下3種類があります。 1.トレンドデータの長期的な傾向。時間の経過とともに値が上昇・下降している時系列データ ...

続きを読む

IT・プログラミング Python

2024/4/1

【Python】主成分分析の実装

こちらの記事では、主成分分析を実装していきます。 Contents1 主成分分析とは2 主成分分析の手順について 主成分分析とは 主成分分析とは、次元削減を行う時によく使う手法です。例えば、いくつかの特徴量があるデータを2次元データに変換すると、できるだけ情報を保ったまま2軸での描画が可能になり、全てのデータを見やすく示すことができます。 主成分分析の実用例として、製品やサービスのスコアリングや比較(1次元に圧縮)、データの可視化(2,3次元に圧縮)、回帰分析の前処理などが挙げられます。 主成分分析の手順 ...

続きを読む

IT・プログラミング Python

2024/4/1

【Python】カーネル主成分分析の実装

こちらの記事では、カーネル主成分分析の手順についてまとめています。 Contents1 カーネル主成分分析とは2 カーネル主成分分析の実装 カーネル主成分分析とは 回帰分析等、機械学習の多くのアルゴリズムは線形分離できるデータが与えられることを前提としていますが、現実的には線形分離できないデータ、つまり非線形分離する必要があるデータがほとんどです。非線形分離する必要があるデータに対処できるのが、カーネル主成分分析(kernel PCA)です。 カーネル主成分分析ではN×M(データの数×特徴の種類)のデータ ...

続きを読む

IT・プログラミング Python

2024/3/29

【Python】機械学習(教師なし) クラスタリング DBSCANの実装

こちらの記事では、機械学習(教師なし)の非階層的クラスタリング DBSCAN法についてまとめていきます。 Contents1 クラスタリングとは2 DBSCANでの実装 クラスタリングとは データをクラスター(塊)に分割する操作のことです。クラスタリングの中でも階層的クラスタリングと、非階層的クラスタリングの2種に分けられています。 1.階層的クラスタリングデータの中から最も似ている組み合わせを探し出して、順番にクラスターにしていく方法です。最終的に全データをまとめるクラスターに行くつけば終了です。 2. ...

続きを読む

IT・プログラミング Python

2024/3/28

【Python】機械学習(教師なし) クラスタリング k-meansの実装

こちらの記事では、機械学習(教師なし)の非階層的クラスタリング k-means法についてまとめていきます。 Contents1 クラスタリングとは2 k-means法での実装 クラスタリングとは データをクラスター(塊)に分割する操作のことです。クラスタリングの中でも階層的クラスタリングと、非階層的クラスタリングの2種に分けられています。 1.階層的クラスタリングデータの中から最も似ている組み合わせを探し出して、順番にクラスターにしていく方法です。最終的に全データをまとめるクラスターに行くつけば終了です。 ...

続きを読む

IT・プログラミング Python

2024/3/28

【Python】機械学習のデータ前処理 外れ値の扱いについて

外れ値の処理についてまとめています。 Contents1 外れ値とは?2 外れ値の検知方法について 外れ値とは? 外れ値とは、他のデータと著しく乖離したデータのことを指します。データ内に外れ値が混在していると、分析結果に影響を及ぼしたり、機械学習モデルの学習過程で影響がでてしまい学習が進みにくくなる、などの影響が出てしまいます。 外れ値の検知方法について 外れ値の検知方法について、可視化、LOF(Local Outlier Factor )、Isolation Forestの3つの手法について紹 ...

続きを読む

IT・プログラミング Python

【Python】Pythonでの自然言語処理(日本語)

こちらの記事では、自然言語処理についてまとめています。

自然言語処理とは?

自然言語とは、日本語や英語のような自然発生的に生まれた言語です。
日常的に使用している自然言語について、言葉が持つ意味を解析し処理します。活用事例としては、チャットボット、音声認識AI、文字認識(手書き文字をカメラが認識し文字データへと変換する技術)、検索エンジン、翻訳、感情分析、文章要約などがあります。

文章の意味を機械に理解させるには、単語分割を行う必要があります。手法は主に2つあります。

1.形態素解析
形態素とは意味を持つ最小の言語単位で、単語は一つ以上の形態素を持ちます。
形態素解析は、辞書を利用して形態素に分割し、さらに形態素毎に品詞などの情報を付与することです。

2.Ngram
N文字毎、N単語毎に文章を切り分ける手法です。1文字ないし1単語で切り分けたものをユニグラム、2文字(単語)毎をバイグラム、3文字(単語)
毎をトリグラムと呼びます。Ngramは形態素解析のように辞書や文法的な解釈が不要なため言語に関係なく使用可能ですが、ノイズが大きくなるというデメリットがあります。

自然言語処理の実装

形態素解析を行う際は形態素解析ツールを使用します。日本語の形態素解析ツールとしてが、MeCabやjanome等があります。
今回はjanomeを使って形態素解析を行い、単語の頻出数を棒グラフとwordcloudで可視化してみたいと思います。

#必要なライブラリをインポートする
import re
import unicodedata
from janome.tokenizer import Tokenizer
import matplotlib.pyplot as plt
from collections import Counter
from matplotlib import font_manager
from wordcloud import WordCloud

with open("sample.txt", encoding="utf=8") as f:
    text = f.read().replace('\n', '').replace(' ','')

#text内に格納された文章の中で不要な文字や記号を削除する
text = re.sub(":","", text)

#janomeで形態素解析を行う
t = Tokenizer()
tokenized_text = t.tokenize(text)

#格納する空リストを作成する
word_list = []
for token in tokenized_text:
    tokeneized_word = token.surface # 形態素解析
    hinshi = token.part_of_speech.split(",")[0]
    if (hinshi == "名詞") or (hinshi == "動詞"):
        word_list.append(tokeneized_word)

#Top20の頻出単語を棒グラフで可視化してみる
# 単語の出現頻度をカウント
word_freq = Counter(word_list)

# 上位20件の単語とその頻度を取得
top_words = word_freq.most_common(20)

# 単語と頻度をそれぞれリストに分割
words, freqs = zip(*top_words)

# 日本語フォントの指定
jp_font_path = 'BIZ-UDGOTHICB.TTC'
jp_prop = font_manager.FontProperties(fname=jp_font_path)

# 棒グラフの描画
plt.figure(figsize=(10, 6))
plt.bar(words, freqs, color='skyblue')
plt.xlabel('Words', fontproperties=jp_prop)  # X軸ラベルに日本語フォントを指定
plt.ylabel('Frequency')
plt.title('Top 20 Words by Frequency')
plt.xticks(rotation=45, ha='right', fontproperties=jp_prop)  # X軸のラベルを回転させて読みやすくし、日本語フォントを指定
plt.tight_layout()
plt.show()

#WordListに含まれる言葉を空白で区切って一つの文字列にする
words_wakachi = " ".join(word_list)
print(words_wakachi)

#日本語のフォントを指定する
font = 'BIZ-UDGOTHICB.TTC'

#意味のない言葉を除外する
stopWords = ["さ","する","これ","あり","こと","でき","し","い","ため"]

#WordCloudを表示する
word_cloud = WordCloud(font_path=font, width=800, height=400,
                        stopwords=set(stopWords),min_font_size=5, 
                        collocations=False, background_color='white', 
                        max_words=400).generate(words_wakachi)

figure = plt.figure(figsize=(15,10))
plt.imshow(word_cloud)
plt.tick_params(labelbottom=False, labelleft=False)
plt.xticks([])
plt.yticks([])
plt.show()

ではブロック毎に見ていきたいと思います。

#必要なライブラリをインポートする
import re
import unicodedata
from janome.tokenizer import Tokenizer
import matplotlib.pyplot as plt
from collections import Counter
from matplotlib import font_manager
from wordcloud import WordCloud

with open("sample.txt", encoding="utf-8") as f:
    text = f.read().replace('\n', '').replace(' ','')

#text内に格納された文章の中で不要な文字や記号を削除する
text = re.sub(":","", text)

まず、必要なライブラリをインポートし、今回解析したいテキストが格納されているsample.txtを読み込み、改行・空白、そして不要な記号(今回は":"を取り除いています)を削除します。

#janomeで形態素解析を行う
t = Tokenizer()
tokenized_text = t.tokenize(text)

#格納する空リストを作成する
word_list = []
for token in tokenized_text:
    tokeneized_word = token.surface # 形態素解析
    hinshi = token.part_of_speech.split(",")[0]
    if (hinshi == "名詞") or (hinshi == "動詞"):
        word_list.append(tokeneized_word)

まず、Tokenizer()を使用してjanomeのTokenizerオブジェクトを作成し、textを入れて形態素解析を行います。
for文を使って、トークンリスト内の各トークンに対して処理を行います。トークンを表示すると以下画像のようなものが表示されます。
token.surfaceで形態素解析した言葉が(以下で言う電子、ピアノ等)、token.part_of_speech.split(",")[0]で品詞が取り出せます。
今回は、名詞と動詞を抽出し、予め準備しておいた空のリストにappendで格納します。

#Top20の頻出単語を棒グラフで可視化してみる
# 単語の出現頻度をカウント
word_freq = Counter(word_list)

# 上位20件の単語とその頻度を取得
top_words = word_freq.most_common(20)

# 単語と頻度をそれぞれリストに分割
words, freqs = zip(*top_words)

# 日本語フォントの指定
jp_font_path = 'BIZ-UDGOTHICB.TTC'
jp_prop = font_manager.FontProperties(fname=jp_font_path)

# 棒グラフの描画
plt.figure(figsize=(10, 6))
plt.bar(words, freqs, color='skyblue')
plt.xlabel('Words', fontproperties=jp_prop)  # X軸ラベルに日本語フォントを指定
plt.ylabel('Frequency')
plt.title('Top 20 Words by Frequency')
plt.xticks(rotation=45, ha='right', fontproperties=jp_prop)  # X軸のラベルを回転させて読みやすくし、日本語フォントを指定
plt.tight_layout()
plt.show()

Counter(word_list)でword_list内の単語頻出頻度をカウントします。これにより各単語の出現回数が辞書の形で返されます。
word_freq.most_common(20)で出現頻度の高い上位20件の単語とその頻度を取得します。
zip(*top_words)で上位単語と頻度をそれぞれwordsとfreqsリストに分割します。単語と頻度を別々のリストとして取得できます。
今回は日本語フォントをグラフに適用させたいので、日本語フォントのファイルパスを指定し、FontPropertiesオブジェクトを作成しておきます。Matplotlibで描画すると以下のようなグラフが表示されます。

#WordListに含まれる言葉を空白で区切って一つの文字列にする
words_wakachi = " ".join(word_list)
print(words_wakachi)

#日本語のフォントを指定する
font = 'BIZ-UDGOTHICB.TTC'

#意味のない言葉を除外する
stopWords = ["さ","する","これ","あり","こと","でき","し","い","ため"]

#WordCloudを表示する
word_cloud = WordCloud(font_path=font, width=800, height=400,
                        stopwords=set(stopWords),min_font_size=5, 
                        collocations=False, background_color='white', 
                        max_words=400).generate(words_wakachi)

figure = plt.figure(figsize=(15,10))
plt.imshow(word_cloud)
plt.tick_params(labelbottom=False, labelleft=False)
plt.xticks([])
plt.yticks([])
plt.show()

まず、word_listを空白で区切り一つの文字列にします。

もともとは↑でしたが、加工後は↓のようになりました。

日本語フォントを指定し、stopWordsで意味のない言葉を指定しておきます。
WordCloudでWordCloudを表示するための準備を行い、Matplotlibで描画をすると、以下のようになります。

  • この記事を書いた人

Haru

会社員。2回目の育休から仕事復帰。
職種は海外営業。
育休の過ごし方、育児、家事、プログラミング勉強について発信しています。

-IT・プログラミング, Python
-, , ,