📚

ロシア語NLPライブラリ調査

に公開

ロシア語のレンマ化、文法情報の付与、構文解析などの基本的な処理を行うライブラリ・ツールを比較した。

コードは以下のリポジトリにある。

https://github.com/miy-h/russian-nlp-sandbox

結論

現状ではとりあえずStanzaを使っておくのが良さそう。それ以上の精度が必要な場合はツール探しの旅に出る必要がある。

spaCy

https://spacy.io/models/ru

多言語NLPライブラリ。

2025年5月現在、公式のロシア語用モデルは大中小の3種類が存在する。体感でも公式サイトの精度評価でもモデル間に意味のある差は見出せなかったので、1番小さいものを使えば問題なさそう。spaCyはtransformerベースのモデルもサポートしているが、ロシア語にはまだ(公式では)来ていない。

処理は爆速で精度はまずまず。品詞や形態素情報の付与は及第点だが、レンマ化の精度はかなり微妙。おそらくロシア語のlemmatizerが辞書・ルールベースであるせいで未知語に極めて弱くなっている。あと"Он не знает ни одного поражения."みたいな文章でодногоをодинに戻せていないが、これはルールベース云々ではなくspaCy側のlemmatizerのバグだと思う。

https://github.com/explosion/spaCy/blob/41e07772dc5805594bab2997a090a9033e26bf56/spacy/lang/ru/lemmatizer.py

spaCyにはtrainable lemmatizerという機械学習ベースのlemmatizerもあるが、公式のロシア語用モデルは対応していない。対応してほしい。

ドキュメントが充実していてAPIの設計もまともだしメンテナンスも行き届いている。レンマ化の精度さえどうにかなれば……

Stanza

https://stanfordnlp.github.io/stanza/

PyTorchベースの多言語NLPライブラリ。

構文解析の精度はちゃんと確認していないので分からないが、レンマ化だけなら十分な精度が出ていた。未知語(人名や地名)で変な結果を出したりもしない。spaCyほどではないが処理もそこそこ速い。

CUDA環境であればデフォルトでGPUを使ってくれるが、パイプライン生成時のオプションでdevice='mps'と書けばMacのGPUでも推論を実行できる。ただし手元のM1 Mac(2020)で試したところ、理由は不明だが逆に推論が遅くなってしまった。

ドキュメントが充実していてAPIの設計もまともだしメンテナンスも行き届いている。

Trankit

https://github.com/nlp-uoregon/trankit

PyTorchベースの多言語NLPライブラリ。学習にtransformerを使っている。

transformerベースなので相当重いはずだが、baseモデルはCPUのみの環境でもStanzaの0.3〜0.4倍くらいの速度は出ていた。Trankitの公式サイトに載っている比較データを見る限り、文法事項や構文などの詳しい情報が必要な場合はtransformerの真価が発揮されそうだが、ロシア語のレンマ化だけなら正直Stanzaとほぼ精度は変わらない。

メンテナンス状況に不安があり、動かすだけで非常に苦労した。依存関係(今回はtransformersnumpy)のバージョン指定が雑すぎて、ユーザー側でoverride-dependenciesの黒魔術を使わないとエラーなく動かすことすらできない。明らかに壊れているのにissueへの反応はなく、ユーザーが修正のために作ったプルリクエストはマージされないまま放置されている。しかもPyTorchのバージョンが古すぎてPython v3.12に上げられない。もしプロジェクトがこのまま放置され続けたら、依存関係がもっと壊れて動かすのがさらに難しくなるだろう。

大学の組織としてソフトウェアを公開し使ってもらおうとするならば、研究者個人の善意に依存しないメンテナンス体制の整備が必要だと思う。研究組織がOSSのソフトウェアを開発・維持するのはそう簡単な仕事ではない。

MyStem

https://yandex.ru/dev/mystem/

ロシア語用の古典的な形態素解析器、ただし未知語耐性あり。あくまで形態素解析器なので構文解析はできない。

初出は2003年、最新版はおそらく2018年とかなり古いし(しかもウェブサイトにリリース日が載っていない)、ソースコードも公開されていない。配布された実行ファイル1つが全てなのでライブラリでラップしたければ内部でMyStemをサブプロセスとして実行させる必要がある。FFIなんて立派なものはない。x86_64用のビルドしかないのでたとえばApple siliconには非対応だし(Rosettaいつもありがとう)、自前でビルドすることもできない。

2025年にもなって使う意義はあまりなさそうだが、どうしても古典的な形態素解析器の処理速度が欲しい場合は候補に上がるかもしれない。せめてソースコードが公開されていれば……

natasha

https://github.com/natasha/natasha

ロシア語特化のNLPライブラリ。spaCyよりさらに爆速だが、レンマ化はpymorphy2ベースなので未知語に弱い。

BERTベースのモデルもあるようだが、使い方が分からなかった。APIドキュメントが充実していないし、そもそもメンテナンス状況がかなり不安。非推奨の警告が出ることを報告したissueが1年放置されている……

https://github.com/natasha/natasha/issues/138

DeepPavlov

https://github.com/deeppavlov/DeepPavlov

ロシア語特化ツールとして有望そうだったが、そもそも動かすことができなかった。

その他

まだ試していないツール群:

GitHubで編集を提案

Discussion