形態素解析について、Python実装を交えて解説します!

Digital Transformation(DX)

皆さんは「形態素解析」について知っていますか?

「形態素解析」はGoogle等の検索アルゴリズムや、文字入力の際のかな・漢字変換、予測変換など私達の身近な所で応用される自然言語処理技術で、AIの一種です。

そんな形態素解析について、その概要といくつかの形態素解析システムの紹介、そしてそれぞれの形態素解析システムのPython実装について解説します。

目次

  1. 1. 形態素解析とは
  2. 2. テキスト処理について
  3. 3. Mecab
  4. 4. JUMAN
  5. 5. ChaSen
  6. 6. Sudachi
  7. 7. 辞書について
  8. 8. 形態素解析の応用例

形態素解析とは

言葉の最小単位、形態素

形態素解析」とは、語の構造を分割し、分割されたものの品詞や語形処理について解析する、ということを指します。

「語」とは、英語でいえば「books」、日本語で言えば「美しさ」などいわゆる「単語」と呼ばれるものを指しますが、これらは「book / s」、「美し / さ」と更に小さい単位にすることが可能です。

この更に小さい単位のことを「形態素」と呼びます。また、「ある言語において意味を担う最小の単位」とも定義されます。

形態素解析は、例えばGoogleやyahooの検索エンジンの検索精度向上など、非常に身近な所で役に立っています。

そんな形態素解析という技術について、その実装方法も含めて次項以降詳しく解説します。

テキスト処理について

 

単語一つ一つを丁寧に人力で解析するのであればまだしも、形態素解析の技術を現代社会に活かすには自然言語処理システムの構築が必要です。そこでまず、システムに言語を理解させるためのテキストの表現方法を考える必要があります。

文字コード「符号化文字集合」「符号化方式」

コンピュータ上では「文字コード」と呼ばれる概念があります。更にこの概念は2つの概念に分けて考えることが可能で、それぞれ「符号化文字集合」「符号化方式」という名前がついています。

符号化文字集合とは、「あ」や「n」などの1文字の集合「文字集合」を定義し、その各要素(「あ」など)に一対一で数字を紐付ける規則のことを指します。符号化文字集合の例に「ASCII」や「JIS」、「Unicode」等がありますが、例えば「ASCII」コードでは、「a」は97番に対応づけられています。一見、この対応表があればコンピュータ上でのテキスト表現が出来るように思えますが、符号化文字集合は一定の型で定義されたものであり、システムにこれをこのまま入れても、システムの型が符号化文字集合に対応していないものであれば符号化文字集合を活用することは出来ません。

そこで、システムに合うように符号化文字集合の型を調整する規則である「符号化方式」が活躍します。具体的には、符号化文字集合からシステムに対応した型に写す「符号化(エンコード)」、またその逆の操作の「復号化(デコード)」の2種類の相互の処理を行うことで、システムと符号化文字集合の橋渡しをします。符号化方式の例に「UTF-8」がありますが、これは符号化文字集合の「Unicode」に対応するもので、これらは全世界の文字を統一的に扱おうという名目で開発されたもので多言語に対応しており、世界でも日本でも最もメジャーな文字コードの1つです。

UCS正規化/CSI

前項の「文字コード」と、あともう1つ多言語処理を行うための方式を導入しなければ自然言語処理システムに言語を読み取らせることは不可能です。

その「方式」は「UCS正規化方式」、「CSI」の2種類で、開発言語の種類等に合わせてどちらかを選択する必要があります。

1つ目の「UCS正規化方式」は、システム側のコードを文字集合「UCS」に統一して扱う方式のことで、この方式を用いることで、本来文字コードの種類によって前処理をしなければならない処理もそのまま処理することが可能になります。Unicodeとの相性の良さもあり、PythonやJavaなどほとんどのプログラミング言語、WindowsやMacOSなどのOSで広く採用されています。一方、UCSも文字コードの要素一つ一つ全てには対応しておらず、例えば特殊な文字などは各種文字コードをUCSに変換する際に情報落ちしてしまうリスクがあります。

2つ目の「CSI」は、UCS正規化方式のような文字コードの「決め打ち」を行わずに、各種文字コードを直接扱う方式のことで、UCS正規化方式の弱点であった変換時の情報落ちリスクがありません。変換がない分処理も高速ですが、文字列ごとに対応が変わるため実装が複雑であることが課題です。この方式を採用している言語・OSは少ないですが、Rubyは数少ないCSI採用言語です。

正規化

自然言語処理システムは、動作するだけでなくその「精度」も重要視されます。その自然言語処理の精度を向上させる上で、「正規化」は非常に重要な概念です。

例えば、私たち人間は半角の数字「2」と全角の数字「2」は同じ意味を持つものであると認識出来ますが、システム上でこれらは違う文字コードを持つ全く別の文字であるという風に認識されてしまいます。これらの文字を自然言語処理を行う上で「正規化」することで同一の意味を持たせ、精度の向上を図ることが可能です。

<pythonでの正規化例>

$ python
>>> import unicodedata #Unicodeデータベースモジュールをインポート
>>> text = "①11"
>>> unicodedata.normalize("NFD",text) #4つの方法で「①11」を正規化
'①11'
>>> unicodedata.normalize("NFC",text)
'①11'
>>> unicodedata.normalize("NFKD",text)
'111'
>>> unicodedata.normalize("NFKC",text)
'111'
print(mecab.parse(text))

[コード引用元]
>> Unicode正規化 -Qiita

以上の様に、Pythonにおける正規化の実装は非常に短いコードで行うことが可能です。このコードではテキストデータ「①11」を4種類の手法でそれぞれ正規化していますが、この中で一般的に用いられる正規化は一番最後の「NFKC」と呼ばれる手法です。詳しい説明は省きますが、NFKCは正規化の中でも同一な意味の文字を短く効果的にまとめ上げることが出来る手法です。

MeCab

この章からは、いくつかの形態素解析システムを紹介します。
形態素解析ソフト、MeCab

1つ目はMeCabです。MeCabは様々な用途において、現段階で最もメジャーな形態素解析システムです。理由として、前処理・後処理で行えることは実行せず、代わりにライブラリを充実させることでコードの簡略化を実現しているところや、他の形態素解析システムと比べて高性能・高速であることが挙げられます。

MeCabはC++で実装されているシステムなので、MeCabを直接使用しPythonで実装するには、特殊なインターフェイスを通す必要があります。しかし、昨今では各言語でMeCabのシステムが再実装されており、Pythonでは「janome」というシステムがMeCabの再実装システムに当たります。以下に示しますが、Pythonを用いる場合はMeCabを直接使うのではなく、janomeを使って解析結果を得ることをおすすめします。

<pythonによるMeCab(janome)実装>

$ python
pip install janome #janomeインストール

from janome.tokenizer import Tokenizer #tokenizerインスタンスを作成
t = Tokenizer() 

tokens = t.tokenize(u'みんな栄養に頼りすぎてる') #「みんな栄養に頼りすぎてる」を形態素に分ける
 
for token in tokens:
    print(token)

[コード引用元]
>> 【Python】日本語の文章を解析できる「Janome」を使ってみた

以上のコードを実行すると、次のように形態素ごとに品詞やその他要素を解析したものが出力されます。

みんな 名詞,代名詞,一般,*,*,*,みんな,ミンナ,ミンナ
栄養 名詞,一般,*,*,*,*,栄養,エイヨウ,エイヨー
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
頼り 動詞,自立,*,*,五段・ラ行,連用形,頼る,タヨリ,タヨリ
すぎ 動詞,非自立,*,*,一段,連用形,すぎる,スギ,スギ
てる 動詞,非自立,*,*,一段,基本形,てる,テル,テル

以下の動画では、実際にMeCabによるPythonを用いた解析が行われています。分かりやすい解説なので共有します。

JUMAN

形態素解析ソフト、JUMAN
JUMANは1992年から2022年現在に至るまで、京都大学工学部黒橋・村脇研究室で開発され続けている形態素解析システムで、最も歴史の長い形態素解析ソフトの1つです。

JUMANの特徴は、辞書(後ほど説明します)などのパラメータを解析者が設定できる点にあります。目的によってパラメータを変化させることが可能であり、このことは研究者が解析をスムーズに行う上でとても貴重な機能です。

またJUMAN自体の更新は2014年で止まってしまっているのですが、その後Juman++という文法・辞書をJUMANから受け継いだいわゆる「高性能JUMAN」のようなものが同研究室で開発され続けています。今回のPython実装例もJuman++の実装例を取り上げます。

<JUMAN(Juman++) Python実装例>

$ python
#  jumanpp-1.02に含まれるREADME_ja.mdに従って、以下の様にインストールを進める
wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-1.02.tar.xz
tar xJvf jumanpp-1.02.tar.xz
cd jumanpp-1.02
./configure
make
sudo make install

echo "すもももももももものうち" | jumanpp #「すもももももももものうち」でテスト

[コード引用元]
>> pyknp(JUMANN++)で形態素解析してみた

以上の解析を行うと、次のような結果が出力されます。

$ python
すもも すもも すもも 名詞 6 普通名詞 1 * 0 * 0 "代表表記:酸桃/すもも 自動獲得:EN_Wiktionary"
@ すもも すもも すもも 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:テキスト"
も も も 助詞 9 副助詞 2 * 0 * 0 NIL
もも もも もも 名詞 6 普通名詞 1 * 0 * 0 "代表表記:股/もも カテゴリ:動物-部位"
@ もも もも もも 名詞 6 普通名詞 1 * 0 * 0 "代表表記:桃/もも 漢字読み:訓 カテゴリ:植物;人工物-食べ物 ドメイン:料理・食事"
も も も 助詞 9 副助詞 2 * 0 * 0 NIL
もも もも もも 名詞 6 普通名詞 1 * 0 * 0 "代表表記:股/もも カテゴリ:動物-部位"
@ もも もも もも 名詞 6 普通名詞 1 * 0 * 0 "代表表記:桃/もも 漢字読み:訓 カテゴリ:植物;人工物-食べ物 ドメイン:料理・食事"
の の の 助詞 9 接続助詞 3 * 0 * 0 NIL
うち うち うち 名詞 6 副詞的名詞 9 * 0 * 0 "代表表記:うち/うち"
EOS

以下の動画では、実際にJuman++によるPythonを用いた解析が行われています。分かりやすい解説なので共有します。

ChaSen

形態素解析ソフト、ChaSen

Chasenは、奈良先端科学技術大学院大学の松本研究室で開発されている、JUMANと同じくアカデミア出身の形態素解析システムです。

JUMANをベースにC言語で実装されているため解析システムはJUMANに非常に似通ったものになっていますが、JUMANは解析用パラメータを解析者が調整する一方で、ChaSenはChaSen開発者が正しく解析したデータを基に、統計的な手法で推定しています。

<準備(各種ライブラリインストール、実装まで)>

$ python
#ChaSenのためのライブラリ等の準備
yum install nkf gcc gcc-c++
cd ~/download
wget http://chasen.org/~taku/software/darts/src/darts-0.32.tar.gz
cd ~/src
tar xzvf ../download/darts-0.32.tar.gz
cd darts-0.32/
./configure
make
make install 

#ChaSen本体インストール
cd ~/download 
wget 'https://ja.osdn.net/frs/redir.php?m=jaist&f=%2Fchasen-legacy%2F56305%2Fchasen-2.4.5.tar.gz' -O chasen-2.4.5.tar.gz
cd ~/src
tar xzvf ../download/chasen-2.4.5.tar.gz
cd chasen-2.4.5/
./configure
make
make install

#ChaSen辞書インストール
wget 'https://ja.osdn.net/frs/redir.php?m=ymu&f=%2Fipadic%2F24435%2Fipadic-2.7.0.tar.gz' -O ipadic-2.7.0.tar.gz 
cd ~/src/
tar xzvf ../download/ipadic-2.7.0.tar.gz
cd ipadic-2.7.0/
./configure
make
make install

#文字化けを防ぐため、辞書をUTF-8に変更
cd ~/src/ipadic-2.7.0/ 
make clean
find -name '*.dic' | xargs nkf --overwrite -w
find -name '*.cha' | xargs nkf --overwrite -w
`chasen-config --mkchadic`/makemat -i w
`chasen-config --mkchadic`/makeda -i w chadic *.dic
./configure
make
make install
nkf -w --overwrite /usr/local/etc/chasenrc

[コード引用元]
>> Python3からChaSenを使う@CentOS 7

<「これは、テストです」を形態素解析>

$ python
>>>echo 'これは、テストです。'|chasen -iw
これ    コレ    これ    名詞-代名詞-一般
は      ハ      は      助詞-係助詞
、      、      、      記号-読点
テスト  テスト  テスト  名詞-サ変接続
です    デス    です    助動詞  特殊・デス      基本形
。      。      。      記号-句点
EOS

Sudachi

形態素解析ソフト、Sudachi
今回最後に紹介する形態素解析システムは、株式会社ワークスアプリケーションズ徳島人工知能NLP研究所が中心となって開発を行っている「Sudachi」です。

同システムは開発開始が2017年ととても新しい日本語形態素解析システムで、商業利用に耐えうる高品質で使い勝手の良い形態素解析器を目標として現在も開発が続いています。

Sudachiの代表的な特徴として、形態素分割のモードがA, B, Cの3種類用意されている点が挙げられます。Aは短い単位で形態素に分割するモードですが、Cは固有表現にやさしいモードで、Bはその中間という設定です。例えば「新国立美術館」はAモードでは「新/国立/美術/館」と分割されますが、Bモードでは「新/国立/美術館」、更にCモードでは「新国立美術館」というようにCモードやBモードは区切り幅が大きくなる傾向があります。

PythonではSudachiPyというSudachiのPython版を用います。MyCabと同様、tokenizerインスタンスを作成することで比較的短いコードで使うことが出来ます。

$ python
pip install sudachipy sudachidict_core

dict = sudachipy.Dictionary() # 辞書を作る
tokenizer = dict.create() # 辞書から分割器を作る

#「関西国際空港」の解析で3つのモードを利用してみる
#Cモード
>>> tokenizer.tokenize("関西国際空港", mode=sudachipy.SplitMode.C)
<MorphemeList[
<Morpheme(関西国際空港, 0:6, (0, 1564531))>,
]>
#Bモード
>>> tokenizer.tokenize("関西国際空港", mode=sudachipy.SplitMode.B)
<MorphemeList[
<Morpheme(関西, 0:2, (0, 735344))>,
<Morpheme(国際, 2:4, (0, 365535))>,
<Morpheme(空港, 4:6, (0, 602797))>,
]>
#Aモード
>>> tokenizer.tokenize("関西国際空港", mode=sudachipy.SplitMode.A)
<MorphemeList[
<Morpheme(関西, 0:2, (0, 735344))>,
<Morpheme(国際, 2:4, (0, 365535))>,
<Morpheme(空港, 4:6, (0, 602797))>,
]>

[コード引用元]
>> SudachiPyを使ってみる

辞書/コーパスについて

自然言語処理における「辞書」「コーパス」とは
最後に、「辞書」という概念について解説します。紙の辞書や電子辞書は私たちにとっても馴染みが深いものですが、自然言語処理における「辞書」も意味合いで言えば近いものになります。

自然言語処理システムにおける「辞書」とは、語とその意味、読み、品詞、使用分野、用法や、類義語、対義語、用例等をまとめたものにあたります。無数の「語」(単語)があり、辞書にはその語一つ一つの詳細情報が保存されている、というイメージで構いません。

形態素解析の際、特に日本語形態素解析では「辞書」がとても役に立ちます。日本語は英語のように明らかな単語の区別が存在しないので、辞書により語・形態素への分解を行うことで解析がスムーズになります。また、単語1つが複数の品詞を持つことが少ないので、辞書により「品詞の区別」→「文法・意味の判別」が可能であり、このことからも日本語形態素解析における辞書の価値の高さが分かると思います。

一方、形態素解析の際には辞書があれば大丈夫かというと、実はそうではありません。例えば、先程とは逆に英語は1つの単語につき4,5個の品詞の種類をもつこともあるので、辞書による品詞の推測が難しくなっています。更に、形態素解析は辞書によるものだけでなく、自然言語で書かれた文書に意味情報を付与した「コーパス」によるものも存在します。「コーパス」は作成・維持に時間・費用がかかる反面、文脈からの情報が追加されることにより、特定の文章における形態素解析精度を辞書によるものよりも向上させることが可能です。現段階では、辞書のコストの安さ・性能をもって形態素解析を行い、その中でも判別境界が曖昧であるとされたものをコーパスにより情報を補って解析する、という「辞書・コーパス併用型」が一般的です。

形態素解析の応用例

ここでは、前項までで述べてきた形態素解析についてより理解を深めるために身近な応用例を説明します。

検索エンジン

現在、形態素解析は、色々な場所で応用されていますが、その例として代表的なのは、「検索エンジン」です。
Yahoo!やGoogleといった検索エンジンでは、検索ワードをそのまま処理するということはしません。
まず、検索ワードが入力されると、入力されたキーワードは、形態素解析により最小単位まで分割されます。次に、検索に不必要な単語を省きます。形態素解析では、このような処理が行われるため、余分なデータを処理せず、効率的な処理が行われます。

例えば、「テニスのラケット」と入力すると、形態素解析により、「テニス・の・ラケット」のように分割されます。次に、検索に必要ない助詞である「の」が省かれ、「テニス ラケット」として検索されます。

スマートニュース(SmartNews)

次の応用例は、スマートニュースです。形態素解析は、このようにニュースアプリなどでも活用されています。スマートニュースは、食品やスポーツなど様々なジャンルのニュースが読めるニュースアプリです。このアプリ内の形態素解析が活用されている部分は、画面上タイトルの文字組みです。

文字組みとは、ユーザーがもじを読みやすいように、文字と文字の間を調節して、文字を配置していく作業のことです。

スマートニュースでは、見出しの「タイトル」の基本形を形態素解析することにより、次の文章の改行位置を決めるという仕組みを用いています。
このように形態素解析を用いることにより利用者がより読みやすい記事の提供を可能にしています。

ここまで読んで頂き、ありがとうございました!

[関連記事]
>> 自然言語処理とは?詳しく解説!

[関連記事]
>> 深層学習とは何か?今後の世界を支える技術を徹底解説します!

[関連記事](シンギュラリティ→人工知能が人間の知能を大きく上回るタイミング
>> シンギュラリティによる雇用の変化

[関連記事]
>> 人工知能(AI)とは?仕組みや技術、できることをわかりやすく解説

[関連記事]
>> ディープフェイクの見破り方