読み込み中...

Pythonで形態素解析する方法10選

Pythonと形態素解析の基本を学ぶ初心者のための図解説明 Python
この記事は約19分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonはデータ解析や自然言語処理に広く使用されているプログラミング言語であり、その理由の一つとしては、その読みやすさとシンプルさが挙げられます。

この記事ではPythonを使用して、形態素解析について学びます。

形態素解析とは、文章を最小の意味単位である形態素に分解する技術で、自然言語処理の基礎的なステップです。

○形態素解析とは?

形態素解析は、文章を形態素と呼ばれる最小の意味単位に分解する処理のことを指します。

この分解により、文章の構造や意味を理解しやすくなります。

形態素解析の結果を用いて、テキスト分析や感情分析、テキストクラスタリングなどが可能になります。

○Pythonと形態素解析

Pythonは形態素解析を行うのに適した言語であり、その理由の一つとしては豊富なライブラリが利用できることが挙げられます。

特に、形態素解析ライブラリとしてMeCabやJanomeがよく使用されます。

●Pythonの環境設定

Pythonの形態素解析を始めるには、まずPythonの環境を整える必要があります。

○Pythonのインストール方法

Pythonの公式サイトから最新版をダウンロードしてインストールします。

また、Anacondaというデータ科学用のPythonディストリビューションを使用することも可能です。

○形態素解析ライブラリのインストール方法

Pythonで形態素解析を行うためには、形態素解析ライブラリが必要となります。

ここでは、MeCabとJanomeの2つのライブラリについて説明します。

Pythonではpipというパッケージ管理ツールを使用してライブラリをインストールすることができます。

ターミナルを開いて次のコマンドを入力します。

pip install unidic-lite
pip install mecab-python3
pip install janome

このコードではpipを使用して形態素解析ライブラリのMeCabとJanomeをインストールしています。

また、MeCabでは辞書としてunidic-liteをインストールしています。

これでPythonと形態素解析ライブラリのインストールが完了しました。

次に、これらのライブラリをどのように使用するかを見ていきましょう。

●形態素解析の基本:MeCabの使い方

ここでは、形態素解析の基本となるライブラリの1つであるMeCabの使い方について説明します。

MeCabはオープンソースの形態素解析エンジンで、Pythonから簡単に使うことができます。

それでは、MeCabの基本的な使い方を見ていきましょう。

○MeCabの基本的な使い方

まずはMeCabのインスタンスを作成し、文字列を引数として形態素解析を行います。

その際に出力されるのは形態素とその情報です。

□サンプルコード1:MeCabを使った形態素解析

このコードでは、PythonのライブラリMeCabを使って形態素解析を行う例を紹介しています。

この例では、まず「import MeCab」を記述してMeCabをインポートし、その後で「mecab = MeCab.Tagger()」を使ってMeCabのインスタンスを生成しています。

そして、「mecab.parse(text)」を使用してテキストを形態素解析しています。

import MeCab

# MeCabのインスタンス生成
mecab = MeCab.Tagger()

# 形態素解析を行うテキスト
text = "Pythonで形態素解析を学ぶ"

# 形態素解析の実行
result = mecab.parse(text)
print(result)

上記のコードを実行すると、引数として与えた文字列が形態素解析され、その結果が出力されます。

それぞれの形態素に対して品詞情報などが付与され、それが一緒に出力されます。

次に、この結果をさらに扱いやすい形に変換する方法を見ていきましょう。

それには「mecab.parse(text).splitlines()」を用いて、結果を行ごとのリストに変換します。

そして、各行をさらにタブで分割し、形態素とその情報を別々に取り出します。

# 形態素解析の結果を行ごとに分割
lines = result.splitlines()

# 各行をさらにタブで分割し、形態素とその情報を取り出す
for line in lines:
    surface, info = line.split('\t')
    print(f"形態素: {surface}, 情報: {info}")

このコードを実行すると、各形態素とその情報が別々に出力されます。

このようにして、形態素解析の結果を自由に扱うことができます。

●形態素解析の基本:Janomeの使い方

JanomeはPythonで使われるもう一つの人気形態素解析ライブラリです。

MeCabと違って、環境設定や外部辞書のインストールなどの手間が少なく、Pythonのパッケージ管理ツールであるpipで簡単にインストールできます。

Janomeの特徴としては、完全にPythonで書かれているため、Python環境さえあればどのOSでも動作し、辞書データもパッケージに含まれているため、初めて形態素解析を行う初心者にとっても取り扱いやすいと言えるでしょう。

○Janomeの基本的な使い方

Janomeの基本的な使い方は非常にシンプルです。

まずはJanomeをインストールします。

Pythonのインタラクティブシェルで下記のコードを実行してみてください。

pip install janome

これでJanomeを使用するための準備は完了です。

□サンプルコード2:Janomeを使った形態素解析

では、具体的なコードを見てみましょう。

このコードではJanomeのTokenizerを使って文章を形態素解析するコードを紹介しています。

この例では、日本語の文章をトークン化して、各トークンの表層形と品詞情報を出力しています。

from janome.tokenizer import Tokenizer

t = Tokenizer()
text = 'Pythonで形態素解析を学ぶ'
for token in t.tokenize(text):
    print(token.surface, token.part_of_speech)

このコードを実行すると、次のような結果が出力されます。

出力結果はMeCabと比較すると、表層形と品詞情報が分かりやすい形で出力されています。

これはJanomeがPythonのみで実装されているため、出力結果をPythonのオブジェクトとして扱いやすいという利点があるからです。

Python 名詞,固有名詞,組織,*
で 助詞,格助詞,一般,*
形態素解析 名詞,固有名詞,一般,*
を 助詞,格助詞,一般,*
学ぶ 動詞,自立,*,*

Pythonで形態素解析を学ぶことの大きなメリットの一つは、コードを自由にカスタマイズできる点です。

たとえば、上記のコードを少し改変することで、特定の品詞の単語だけを抽出するといったことも可能になります。

●形態素解析の応用:頻度分析

頻度分析は、形態素解析によって得られた単語やフレーズの出現回数を計算することです。

これにより、テキストデータ中で特に頻繁に出現する言葉を把握でき、そのテキストの主要な話題やテーマを理解する助けになります。

○頻度分析とは?

頻度分析は一見単純な作業に見えますが、テキストデータから有益な情報を引き出す力強いツールです。

例えば、SNSの投稿からトレンドを把握したり、商品レビューから顧客の主な関心事を見つけたり、あるいは大量のニュース記事から重要なトピックを特定したりすることが可能です。

特に、頻度分析は自然言語処理(NLP)や機械学習の前処理ステップとしてよく用いられます。

それでは、PythonとJanomeを使って、実際に頻度分析を行ってみましょう。

□サンプルコード3:頻度分析のための形態素解析

下記のサンプルコードでは、Janomeを用いた形態素解析の後、Pythonの標準ライブラリであるcollectionsを使って頻度分析を行います。

この例では、文章内の単語の出現頻度を計算しています。

from janome.tokenizer import Tokenizer
from collections import Counter

t = Tokenizer()
text = "Pythonで形態素解析を始めたいと思っていませんか?本記事では、形態素解析の基本から応用まで、具体的なサンプルコードと共に分かりやすく説明します。これを読めばPythonでの形態素解析に挑戦できるようになります。"
tokens = t.tokenize(text)

word_count = Counter(token.surface for token in tokens)
print(word_count.most_common(10))

このコードではまず、janome.tokenizerからTokenizerをインポートして形態素解析器を作成します。

次に、形態素解析を行いたいテキストを指定します。このテキストは後で形態素解析を行うためのものです。

そして、t.tokenize(text)でテキストを形態素解析し、結果をtokensという変数に格納します。

次に、collectionsのCounterクラスを用いて単語の出現頻度を計算します。

Counterクラスは、要素の出現回数を辞書形式で保持するコンテナを提供します。

token.surface for token in tokensで全ての形態素の表層形を取得し、これをCounterに渡して単語の出現回数をカウントします。

最後に、print(word_count.most_common(10))で最も頻繁に出現する10個の単語とその出現回数を表示します。

このコードを実行すると、次のような結果が得られます。

[('形態素解析', 3), ('Python', 2), ('で', 2), ('を', 2), ('本', 1), ('記事', 1), ('では', 1), ('、', 1), ('の', 1), ('基本', 1)]

上記の結果は単語とその出現回数を表しており、出現回数が最も多い順に表示されています。

例えば、「形態素解析」という単語は3回、’Python’や’で’という単語は2回出現しています。

●形態素解析の応用:感情分析

形態素解析の応用例として、感情分析があります。

感情分析とは、テキストデータからそのテキストの作者が持つ感情を推定する技術です。

たとえば、商品のレビューやSNSの投稿文などからユーザーの感情(ポジティブ、ネガティブなど)を分析することで、ユーザーの意見や感情の傾向を把握したり、ユーザーが何に対して喜んでいるのか、何に対して不満を感じているのかを分析することが可能です。

○感情分析とは?

感情分析では、形態素解析によりテキストを単語に分割し、その単語が感情を示すものかどうか、またどのような感情を示しているのかを判断します。

このためには、各単語がどのような感情を表すのかを表した辞書が必要となります。

この辞書を感情辞書と言います。感情辞書には、各単語とそれが表す感情の強さ(スコア)が記載されています。

感情分析では、この感情辞書を用いてテキストの感情スコアを計算し、全体的な感情を判断します。

□サンプルコード4:感情分析のための形態素解析

形態素解析を用いた感情分析のサンプルコードを紹介します。

このコードでは、Pythonの形態素解析ライブラリMeCabと感情分析ライブラリnega_posiを使用しています。

感情辞書としては、nega_posiに内包されている辞書を使用します。

この例では、感情辞書に基づき形態素解析を行い、得られた単語ごとの感情スコアを合計して全体の感情を判断します。

import MeCab
from nega_posi import NegaPosi

def analyze_sentiment(text):
    # 形態素解析の実行
    mecab = MeCab.Tagger("-Ochasen")
    node = mecab.parseToNode(text)

    # 感情分析オブジェクトの生成
    np = NegaPosi()

    # 感情スコアの合計を格納する変数
    score = 0

    while node:
        # ノードの表層形を取得
        surface = node.surface

        # 単語の感情スコアを取得
        word_score = np.analyze(surface)

        # 感情スコアを合計
        score += word_score

        node = node.next

    return score

このコードを実行すると、入力されたテキストの感情スコアが計算されます。

たとえば、「この商品、すごくいいですね!」というテキストを入力すると、感情スコアはポジティブな値になります。

一方、「全然ダメだった。」というテキストを入力すると、感情スコアはネガティブな値になります。

このように形態素解析を利用することで、テキストから感情を分析することが可能になります。

ただし、感情分析は文脈によって感情の解釈が変わる可能性があるため、精度を上げるにはさまざまな工夫が必要です。

その一方で、大量のテキストデータから感情傾向を把握する上では有用な手段となるでしょう。

●形態素解析の応用:テキストクラスタリング

形態素解析の応用例としてテキストクラスタリングがあります。

形態素解析を利用することで、テキストデータを細かい単位(形態素)に分割し、各形態素の意味や役割を理解することが可能になります。

それにより、大量のテキストデータの中から関連性の高いテキストをグループ化(クラスタリング)することが可能になります。

これは例えば、ユーザーレビューやSNSの投稿など、膨大なテキストデータから特定のトピックを抽出するときに有用です。

○テキストクラスタリングとは?

テキストクラスタリングは、大量のテキストデータから類似性の高いものをグループ化する技術です。

クラスタリングの目的は、データを自然なグループに分けることで、データの構造やパターンを理解しやすくすることです。

テキストデータに対しては、特に形態素解析が利用され、各テキストを形態素に分割してから、それらの形態素の出現頻度や連続性などに基づいてテキスト間の類似性を計算します。

□サンプルコード5:テキストクラスタリングのための形態素解析

Pythonのライブラリ、Janomeを使った形態素解析と、その結果を元にしたテキストクラスタリングの例を紹介します。

下記のサンプルコードでは、Janomeを使って形態素解析を行い、その結果をscikit-learnのTfidfVectorizerでベクトル化します。

そして、そのベクトルをKMeansでクラスタリングします。

from janome.tokenizer import Tokenizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans

# 形態素解析器を初期化
t = Tokenizer()

# 形態素解析の関数を定義
def tokenize(text):
    return [token.surface for token in t.tokenize(text)]

# データの定義
texts = ["りんごが好きです", "みかんが好きです", "私は犬が好きです", "私は猫が好きです"]

# TfidfVectorizerを定義
vectorizer = TfidfVectorizer(tokenizer=tokenize)

# ベクトル化
X = vectorizer.fit_transform(texts)

# KMeansでクラスタリング
kmeans = KMeans(n_clusters=2).fit(X)

# クラスタリング結果を出力
print(kmeans.labels_)

このコードではまず、JanomeのTokenizerを使って形態素解析器を初期化します。

次に、テキストを入力として受け取り、形態素解析を行った結果をリストとして返す関数を定義します。

この関数では、形態素解析の結果から形態素(token.surface)のみを取り出しています。

次に、テキストデータを定義します。

ここでは簡単のために、4つの短い文を用意しました。

続いて、TfidfVectorizerを定義します。

TfidfVectorizerは、テキストデータをTF-IDF(Term Frequency-Inverse Document Frequency)という値に変換するクラスです。

TF-IDFは、あるテキストデータにおける単語の出現頻度と、全テキストデータにおけるその単語の出現頻度の逆数を掛け合わせた値です。

これにより、あるテキストデータに特徴的に出現する単語を重視することができます。

TfidfVectorizerの引数に先ほど定義した形態素解析の関数を指定することで、形態素解析の結果に基づいてTF-IDFの計算を行います。

次に、fit_transformメソッドを用いてテキストデータをベクトル化します。

このベクトルは、各テキストデータにおける各単語のTF-IDF値から成るベクトルです。

その後、KMeansクラスを用いてクラスタリングを行います。

KMeansクラスは、k-means法というアルゴリズムを実装したクラスで、テキストデータを任意の数のクラスタに分けます。

クラスタの数は、初期化の際に指定します。

最後に、labels_属性を出力することで、各テキストデータがどのクラスタに分類されたかを確認します。

出力されるラベルは、0からクラスタ数-1までの整数で、同じラベルが付けられたテキストデータは同じクラスタに分類されたということを表します。

このコードを実行すると、出力結果は次のようになります。

[0 0 1 1]

これは、最初の2つのテキストデータ(”りんごが好きです”と”みかんが好きです”)が同じクラスタ(ラベル0)に、残りの2つのテキストデータ(”私は犬が好きです”と”私は猫が好きです”)が同じクラスタ(ラベル1)に分類されたことを表しています。

つまり、形態素解析とクラスタリングにより、”好きなもの”が果物のグループとペットのグループに分けられました。

以上がテキストクラスタリングの基本的な流れです。

形態素解析を用いることで、テキストの類似性を評価し、その結果を元にデータを自然なグループに分けることができます。

これにより、テキストデータの構造やパターンを理解しやすくなるだけでなく、特定のトピックを抽出したり、意見や感情を集約したりするなど、様々な応用が可能になります。

●形態素解析のトラブルシューティング

形態素解析を行う際、エラーメッセージに出会うことがあります。

そのような場合、エラーメッセージを理解し、適切な対処をすることが求められます。

○エラーメッセージの読み方

Pythonのエラーメッセージは通常、エラーの種類とエラーが発生した場所、そして何が問題であるかを示しています。

エラーメッセージを理解することで、どの部分のコードを修正すれば良いのかが分かります。

○よくあるエラーとその対処法

形態素解析を行う際によく出会うエラーとその対処法をいくつか紹介します。

①ライブラリのインストールエラー

これは形態素解析ライブラリ(例えばMeCabやJanome)のインストールが正しく行われていない場合に起こります。

対処法としては、ライブラリのインストールを再度行うか、あるいは他の形態素解析ライブラリを試してみると良いでしょう。

②文字コードエラー

これは、形態素解析対象のテキストデータが想定した文字コード(例えばUTF-8)と異なる場合に起こります。

対処法としては、テキストデータの文字コードを確認し、必要であれば変換することが推奨されます。

③辞書エラー

これは、形態素解析に用いる辞書(例えばMeCabのユーザー辞書)が存在しない、または読み込めない場合に起こります。

対処法としては、辞書の存在とアクセス権を確認し、必要であれば辞書を再設定または再インストールすることが推奨されます。

これらのエラーを理解し対処することで、形態素解析をスムーズに進めることができます。

●形態素解析のカスタマイズ方法

形態素解析は、ライブラリのデフォルトの設定だけでなく、ユーザーがカスタマイズすることも可能です。

例えば、ユーザー辞書を追加することで、特定の単語や表現を特定の形態素として扱うことができます。

○ユーザー辞書の追加

形態素解析ライブラリの中には、ユーザーが独自の辞書を追加できるものがあります。

例えばMeCabでは、CSV形式でユーザー辞書を作成し、それを形態素解析に使用することができます。

ユーザー辞書を使用することで、特定の専門用語や新語、固有名詞などを正確に認識し、適切な形態素として扱うことが可能になります。

□サンプルコード6:ユーザー辞書を使った形態素解析

MeCabを使ったユーザー辞書の追加と、それを用いた形態素解析のサンプルコードを紹介します。

このコードでは、まずユーザー辞書を作成し、それをMeCabの辞書として登録します。

そして、その辞書を用いて形態素解析を行います。

import MeCab

# ユーザー辞書のパスを指定
userdic = "/path/to/your/userdic.csv"

# MeCabの設定を行う
m = MeCab.Tagger(f"-Ochasen -u {userdic}")

# 形態素解析を行う
print(m.parse("Pythonで形態素解析を学ぶ"))

このコードでは、ユーザー辞書のパスを変数userdicに設定します。

パスは、実際のユーザー辞書の場所に合わせて変更してください。

その後、MeCab.Taggerの引数に-uオプションとともにユーザー辞書のパスを指定します。

これにより、MeCabはユーザー辞書を追加して形態素解析を行うことができます。

このコードを実行すると、”Pythonで形態素解析を学ぶ”という文字列に対して形態素解析が行われ、その結果が出力されます。

ユーザー辞書に登録されている単語が文字列に含まれている場合、その単語はユーザー辞書に従って適切に形態素として認識されます。

ここで、ユーザー辞書の作成方法について少し触れておきましょう。

ユーザー辞書はCSV形式で作成しますが、そのフォーマットは一般的に次のようになります。

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

“表層形”は単語そのものを指します。

例えば、”Python”や”形態素解析”などが該当します。

“左文脈ID”や”右文脈ID”、”コスト”は形態素解析の結果に影響を与えるパラメータです。

これらの値は通常、既存の辞書から適当に値を取ります。”品詞”や”品詞細分類”、”活用型”、”活用形”、”原形”は単語の形態素的な特性を指定します。

“読み”や”発音”は単語の読み方を指定します。

このように、ユーザー辞書を利用することで、特定の単語を自分の望むように形態素解析することが可能になります。

まとめ

Pythonで形態素解析を行う方法について解説しました。

形態素解析はテキストデータを単語やフレーズに分割するための重要な技術であり、テキスト分析や自然言語処理において広く利用されています。

この記事を通じて、形態素解析の基本的な概念と実践的なスキルを身につけ、Pythonでの形態素解析に挑戦する一助となれば幸いです。