日本語自然言語処理(NLP)学習 GiNZA/spaCy(1)

技術記事

数年前にMeCabを使って日本語の形態素解析(テキスト分析)をやろうとした経験があるのですが、環境構築の途中で他の事で忙しくなり、終わっていました。知人より「GiNZA/spaCy はお手軽に始めることができるよ」という話を聞いて、再度開始です。背景や使い方をまとめておきます。

GiNZAとは

Ginzaとは、Megagon Labsと国立国語研究所の共同研究結果として公開されたオープンソースの日本語自然言語処理ライブラリです。主な特徴を以下に示します(Megagon Labsのホームページより抜粋)。

  • ワンステップでの導入
  • 高速かつ高精度な日本語の解析処理
  • 依存構造(係り受け)解析や固有表現抽出などの高度なNLP技術を国際化されたフレームワーク上で利用可能

GiNZAはMITライセンスでソースコードが公開されており、商業利用目的の利用も可能です。なお、MITライセンスは縛りが緩くて、利用条件は、「著作権表示」と「MIT ライセンスの全文」を記載する、という2条件のみで商用利用も可能です。

私がありがたいなと思うのは、「ワンステップの導入」です。
従来の日本語自然言語処理環境は各種ツール・辞書を組み合わせた環境作りに手間がかかっていたように思います。簡単にワンステップで環境を構築できるのは、物事を始める時のしんどさが無くなり、ありがたいです。

spaCyとSudachiPy

GiNZAは、spaCy(自然言語処理ライブラリ)とSudachiPy(形態素解析機)という別ツールと連携しています。GiNZAをインストールすると、これら2個のモジュールも同時にインストールされるので、特に意識せずともインストールされます。
Python環境下で利用できます。

spaCy

spaCyは、最先端の機械学習技術を組み込んだ自然言語処理ライブラリです。Explosion AI 社によって開発されているオープンソースです。GiNZAと同様にMITライセンスとなっています。

spaCyを用いて解析するとUniversal Dependencies(UD)という形式で結果が出力されます。UDは異なる言語間で共通化された依存構造アノテーション仕様です。spaCy で解析した品詞のタグや依存関係のラベルは、この Universal Dependencies に基づいている為、異なる言語でも spaCy で解析すれば、その後に続く処理を同一ロジックで対応できるという非常に大きな利点があります。

SudachiPy

SudachiPyは、トークン化処理に利用するオープンソースの形態素解析器です。徳島人工知能NLP研究所によって開発されています(https://github.com/WorksApplications/SudachiPy)。Apache License 2.0で提供されています。

規模の大小で3段階の辞書(Small/Core/Full)が準備されています。継続的にメンテナンスが行われており、大体半年に約1回の頻度で更新されているようです(https://github.com/WorksApplications/SudachiDict/releases)。
ユーザ辞書も追加して解析できますので、特別な領域のテキストを解析する際には、その領域の専門用語を含めて解析することができます。

インストール方法

Windows10にpython(v3.9.10)をインストールし、venvでpython仮想環境を作成し、GiNZAをインストールしました。まずは、普通にコマンド画面でpythonを起動した後、以下のコマンドでpython仮想環境を作成します。venvの場合、pythonのバージョンを仮想環境毎に変更できないので、必然的にv3.9.10の仮想環境となります。

最初、anaconda環境でトライしたのですが、conda-forgeにもGINZAのパッケージが無かったので、condaコマンドでインストールできず、断念しました。
anaconda環境上でもpipインストールはできるのですが、インストール方法として、condaとpipを混在させると、環境がおかしくなる可能性があります。

D:\mywork>python -m venv ginzatest

その後、作成した仮想環境ginzatestをアクティベートします。

D:\mywork>.\ginzatest\Scripts\activate
(ginzatest) D:\mywork>

Python仮想環境の準備ができたので、GiNZAのインストールです。以下を見て、実施しました。
GiNZAの公開ページ

最初に、上記ページの「2. GiNZA + 従来型モデル」のインストールをします。さすが「ワンステップの導入」とうたうだけあって、インストールはシンプルです。下記の一行を実行するだけで、OKです。

pip install -U ginza ja_ginza

上記だけでも、GINZAは使えるのですが、より高度な処理ができる「GiNZA + Transformersモデル」(メモリが16GB以上必要)もインストールしました。私の環境は16GBなので、大丈夫かなと思いつつインストールしたのですが、正常にインストールできました。

pip install -U ginza ja_ginza_electra

諸々のメッセージが表示されてインストール完了後、「pip list 」コマンドでどのようなパッケージがインストールされたのか確認しました。

Package            Version
------------------ ---------
blis               0.7.6
catalogue          2.0.6
certifi            2021.10.8
charset-normalizer 2.0.12
click              8.0.4
colorama           0.4.4
cymem              2.0.6
filelock           3.6.0
ginza              5.1.1
ginza-transformers 0.4.1
huggingface-hub    0.4.0
idna               3.3
ja-ginza           5.1.0
ja-ginza-electra   5.1.0
Jinja2             3.0.3
joblib             1.1.0
langcodes          3.3.0
logzero            1.7.0
MarkupSafe         2.1.1
murmurhash         1.0.6
numpy              1.22.3
packaging          21.3
pathy              0.6.1
pip                21.2.4
plac               1.3.4
preshed            3.0.6
progressbar2       3.53.3
pydantic           1.8.2
pyparsing          3.0.7
python-utils       3.1.0
PyYAML             6.0
regex              2022.3.15
requests           2.27.1
sacremoses         0.0.49
setuptools         58.1.0
six                1.16.0
smart-open         5.2.1
spacy              3.2.3
spacy-alignments   0.8.4
spacy-legacy       3.0.9
spacy-loggers      1.0.1
spacy-transformers 1.1.5
srsly              2.4.2
SudachiDict-core   20211220
SudachiPy          0.6.3
SudachiTra         0.1.7
thinc              8.0.15
tokenizers         0.10.3
torch              1.11.0
tqdm               4.63.0
transformers       4.12.5
typer              0.4.0
typing_extensions  4.1.1
urllib3            1.26.9
wasabi             0.9.0

上記結果を見ると、GiNZA、spaCy、SudachiPyがインストールされたことが確認できます。
Sudachi辞書(SudachiDict)は、Coreサイズがインストールされていることも分かります。
Fullの方が語句数が多くて解析能力は高いのですが、今回はテストなので、これで良しとします。

テスト実行

テストとして、以下の文章を従来型モデルで形態素解析してみました。
「facebook社はメタバースにターゲットを絞り、社名をMETAへ変更しました。apple社もメタバースには注目しています。」
上記で作成したpython仮想環境のginzatestで、Ginzaの公開ページに紹介されている、以下のpythonスクリプトを実行します。

import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('facebook社はメタバースにターゲットを絞り、社名をMETAへ変更しました。apple社もメタバースには注目しています。')

for sent in doc.sents:
    for token in sent:
        print(
            token.i,
            token.orth_,
            token.lemma_,
            token.norm_,
            token.morph.get("Reading"),
            token.pos_,
            token.morph.get("Inflection"),
            token.tag_,
            token.dep_,
            token.head.i,
        )
    print('EOS')

以下の結果となります。

0 facebook Facebook Facebook ['フェイスブック'] NOUN [] 名詞-固有名詞-一般 compound 1
1 社 社 社 ['シャ'] NOUN [] 名詞-普通名詞-助数詞可能 nsubj 13
2 は は は ['ハ'] ADP [] 助詞-係助詞 case 1
3 メタバース メタバース メタバース ['メタバース'] ADJ [] 名詞-普通名詞-一般 obl 7
4 に に に ['ニ'] ADP [] 助詞-格助詞 aux 3
5 ターゲット ターゲット ターゲット ['ターゲット'] NOUN [] 名詞-普通名詞-一般 obj 7
6 を を を ['ヲ'] ADP [] 助詞-格助詞 case 5
7 絞り 絞る 絞る ['シボリ'] VERB ['五段-ラ行;連用形-一般'] 動詞-一般 advcl 13
8 、 、 、 ['、'] PUNCT [] 補助記号-読点 punct 7
9 社名 社名 社名 ['シャメイ'] NOUN [] 名詞-普通名詞-一般 obj 13
10 を を を ['ヲ'] ADP [] 助詞-格助詞 case 9
11 META meta メタ ['メタ'] NOUN [] 名詞-普通名詞-一般 obl 13
12 へ へ へ ['ヘ'] ADP [] 助詞-格助詞 case 11
13 変更 変更 変更 ['ヘンコウ'] VERB [] 名詞-普通名詞-サ変可能 ROOT 13
14 し する 為る ['シ'] AUX ['サ行変格;連用形-一般'] 動詞-非自立可能 aux 13
15 まし ます ます ['マシ'] AUX ['助動詞-マス;連用形-一般'] 助動詞 aux 13
16 た た た ['タ'] AUX ['助動詞-タ;終止形-一般'] 助動詞 aux 13
17 。 。 。 ['。'] PUNCT [] 補助記号-句点 punct 13
EOS
18 apple Apple アップル ['アップル'] ADV [] 名詞-普通名詞-一般 advmod 24
19 社 社 社 ['シャ'] NOUN [] 名詞-普通名詞-助数詞可能 nsubj 24
20 も も も ['モ'] ADP [] 助詞-係助詞 case 19
21 メタバース メタバース メタバース ['メタバース'] NOUN [] 名詞-普通名詞-一般 obl 24
22 に に に ['ニ'] ADP [] 助詞-格助詞 case 21
23 は は は ['ハ'] ADP [] 助詞-係助詞 case 21
24 注目 注目 注目 ['チュウモク'] VERB [] 名詞-普通名詞-サ変可能 ROOT 24
25 し する 為る ['シ'] AUX ['サ行変格;連用形-一般'] 動詞-非自立可能 aux 24
26 て て て ['テ'] SCONJ [] 助詞-接続助詞 mark 24
27 い いる 居る ['イ'] VERB ['上一段-ア行;連用形-一般'] 動詞-非自立可能 fixed 26
28 ます ます ます ['マス'] AUX ['助動詞-マス;終止形-一般'] 助動詞 aux 24
29 。 。 。 ['。'] PUNCT [] 補助記号-句点 punct 24
EOS

きちんと形態素解析されていることが分かります。「メタバース」、「facebook」などの単語も認識して処理されています。Apple社の「Apple」が固有名詞ではなく普通名詞になっているのは、仕方ないような気もします。

感想

あっさりインストールできたので、拍子抜けするくらいでした。
今回は、単なる形態素解析だけを試しましたが、spaCyは形態素解析以外にも色々とできるので、後日試してみようと思います。

コメント