🐡

M2 MacでGiNZAのja-ginza-bert-largeを使ってみた

2024/05/28に公開

はじめに

自身のspaCy + GiNZAで構文解析してみるで、ja-ginzaモデルを使用していましたが、解析精度がより高いモデルであるja-ginza-bert-large(β版)を使用してみたいと思い、イントールを試みたところ、インストールに失敗したことがあったため、メモしておきます。

環境構築

開発環境は以下になります。

  • MacBook Pro
  • チップ:Apple M2
  • メモリ:16GB

Pythonのバージョンとライブラリ管理には、Ryeを使用しました。Pythonライブラリ管理ツール決定版!Ryeを導入してみたの記事を参考に導入しました。

spaCyについては、GiNZA公式サイトには、「CUDAに対応し8GB以上のRAMを搭載したGPU環境、または、M1・M2などApple Silicon環境の利用を推奨」とあるので、Apple Siliconに最適化されたspacy[apple]を使用します。

次にライブラリのインストールです(以下はインストールに失敗しています)。

rye pin 3.12.3
rye add "spacy[apple]"
rye add ja_ginza_bert_large --url https://github.com/megagonlabs/ginza/releases/download/v5.2.0/ja_ginza_bert_large-5.2.0b1-py3-none-any.whl
rye sync

「ERROR: Failed building wheel for tokenizers」とエラーが出てインストールに失敗しました。とりあえずエラー文でググると、ERROR: Failed building wheel for tokenizers #1050を見つけ、Pythonのバージョンを3.10系にして再インストールしようとしました。

rye pin 3.10.13
rye add "spacy[apple]"
rye add ja_ginza_bert_large --url https://github.com/megagonlabs/ginza/releases/download/v5.2.0/ja_ginza_bert_large-5.2.0b1-py3-none-any.whl
rye sync

上記だとインストールできました。
pyproject.tomlのdependenciesは以下の通りになりました。

dependencies = [
    "spacy[apple]>=3.7.4",
    "ja_ginza_bert_large @ https://github.com/megagonlabs/ginza/releases/download/v5.2.0/ja_ginza_bert_large-5.2.0b1-py3-none-any.whl",
]

requirements.lockを見ると、spacy-transformers、torch、thinc-apple-opsもインストールされていました。GiNZA公式サイトの「M1やM2などのMPSに対応したApple Silicon環境では、thinc-apple-opsを導入することで解析速度が向上します。」の部分もインストールしてくれているようです。

使ってみる

使い方は、ja-ginzaと同じです。

sample.py
import spacy
import ginza
from spacy.tokens.doc import Doc
from collections import Counter
from spacy.tokens.span import Span

natural_language_processing = spacy.load("ja_ginza_bert_large")

# Sudachi辞書modeをCにする
ginza.set_split_mode(natural_language_processing, "C")

# 単語に分割する対象の文章
text = "NCDC株式会社では、内製化支援も行っています。"

# 解析後の文章を取得する
# この時点で形態素解析や単語間の依存関係解析が同時に行われている
doc: Doc = natural_language_processing(text)

counter = Counter()

# 名詞句ごとにループ
for chunk in doc.noun_chunks:
    # 名詞句の主辞の親となる単語が属する文節を取得する
    head_of_bunsetsu: Span = ginza.bunsetu_span(chunk.root.head)
    counter[(chunk.text, head_of_bunsetsu.text, chunk.root.dep_)] += 1

# 出現回数top 10を表示する
for key, count in counter.most_common(10):
    print(f"{key}\t{count}")
sample.pyの実行
rye run python sample.py
sample.pyの実行結果
('NCDC株式会社', '行っています。', 'obl')       1
('内製化支援', '行っています。', 'nsubj')       1

以上です。ご覧いただき、ありがとうございました。

参考

NCDCエンジニアブログ

Discussion