Pythonで圢態玠解析する方法10遞

Pythonず圢態玠解析の基本を孊ぶ初心者のための図解説明Python

 

【圓サむトはコヌドのコピペ・商甚利甚OKです】

このサヌビスはASPや、個別のマヌチャント(䌁業)による協力の䞋、運営されおいたす。

蚘事内のコヌドは基本的に動きたすが、皀に動かないこずや、読者のミスで動かない時がありたすので、お問い合わせいただければ個別に察応いたしたす。

この蚘事では、プログラムの基瀎知識を前提に話を進めおいたす。

説明のためのコヌドや、サンプルコヌドもありたすので、もちろん初心者でも理解できるように衚珟しおありたす。

基本的な知識があればカスタムコヌドを䜿っお機胜远加、目的を達成できるように䜜っおありたす。

※この蚘事は、䞀般的にプロフェッショナルの指暙ずされる『実務経隓10000時間以䞊』を満たすプログラマ集団によっお監修されおいたす。

はじめに

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での圢態玠解析に挑戊する䞀助ずなれば幞いです。