ハカセノオト

moon indicating dark mode
sun indicating light mode

spaCy からたどる最近の日本語自然言語処理ライブラリの調査

August 10, 2020

最近、spaCy が公式で日本語に対応し、話題になっている。

私自身は、NLP が専門ではないのだが、業務で自然言語を扱う機会があり、このあたりの技術を把握しておく必要があるため、ほぼゼロの知識からサーベイを行った。

spaCy

  • spaCy 公式サイト
  • spaCy は多言語の字句解析・固有表現抽出・品詞タグ付け・ラベル付き依存構造解析機能を提供する汎用自然言語処理フレームワーク
  • 日本語に関しては 3 つのモデルが利用可能 ( doc )
    • 標準日本語モデルへの依存構造解析・固有表現抽出モデル
    • spaCy の日本語モデルの搭載は、Megagon Labs, Tokyo (株式会社リクルートの AI 研究所) と国立国語研究所が尽力したようである ( 論文 )
    • 商用利用が可能
    • “ja_core_news_lg”, “ja_core_news_md”, “ja_core_news_sm”
      • 3 つのモデルはサイズが異なっている
        • lg —> large
        • md —> medium
        • sm —> small
      • core —> モデルの能力として次のタスクを行えることを示す: general-purpose model with vocabulary, syntax, entities and word vectors
      • news —> ニュース記事のデータで学習されたことを示す
      • 参考: モデルの命名規則
    • モデルの説明
      • “Japanese multi-task CNN trained on UD_Japanese-GSD v2.6-NE. Assigns word2vec token vectors, POS tags, dependency parses and named entities.”
      • 日本語のマルチタスク CNN
      • 学習データセットは UD_Japanese-GSD v2.6-NE
      • 以下の内容が含まれる
        • word2vec
          • chiVe を利用 (後述)
        • POS tags (POS: Part-of-Speech, 品詞タグ)
          • SudachiPy による形態素解析
        • 係り受け解析 (依存関係ラベリング)
        • 固有表現抽出 (Named Entity Recognition; NER)
  • streamlit にて簡単可視化するためのパッケージ ( spacy-streamlit ) が提供されている
    • 解析できること
      • 係り受け解析 (依存関係ラベリング、Dependency Parsing) と 品詞タグ (Part-of-speech tags)
      • 固有表現抽出 (Named Entity Recognition; NER)
      • 形態素解析 (Morphological Analysis)
      • テキスト分類 (Text Classification)
        • 試してみると、ここは empty になった(判定不可能ということか?)
      • ベクトル類似度 (Vectors & Similarity)
        • sm モデルでは利用できなかったが、lg モデルだと利用できた
        • 学習されたモデルをベースに、2 つの単語の類似度を調べることができる
      • 形態素解析 (Token attributes)
    • 参考記事: 日本語正式サポートされた自然言語処理ライブラリ spaCy の Streamlit 可視化が超お手軽だった - OPTiM TECH BLOG

Universal Dependencies (UD)

Universal Dependencies (UD) は、多言語間で共通のアノテーション方式を用いて係り受けのツリーバンク を開発する国際プロジェクトである。

UD_Japanese-GSD v2.6-NE は、Megagon Labs, Tokyo (株式会社リクルートの AI 研究所) と国立国語研究所が整備して作成したデータセットである。

chiVe (チャイブ, Sudachi Vector)

  • Source code: WorksApplications/chiVe
  • 概要: “chiVe” (チャイブ, Sudachi Vector) は、大規模コーパスと複数粒度分割に基づく日本語単語ベクトルのデータセット
  • 手法
    • Skip-gram アルゴリズムを元に、word2vec (gensim) を使用して単語分散表現を構築
    • 学習には約 1 億のウェブページ文章を含む国立国語研究所の日本語ウェブコーパス(NWJC)を採用
    • 分かち書きにはワークスアプリケーションズの形態素解析器 Sudachi を使用
  • その他
    • WorksApplications が作成
    • v1.1 mc90 a-unit-only が、自然言語処理ツール spaCy の日本語モデルに使用されている
    • 豊富な語彙数が収録されており、最大で約 360 万語の語彙数を持ったモデルがある。GiNZA がデフォルトで使用しているモデルが約 12 万語のモデルなので、比較すると語彙数の多さがわかる。

Sudachi / SudachiPy

  • 概要
    • Sudachi は日本語形態素解析器です。形態素解析はおもに以下の 3 つの処理を おこないます。( 引用 )
      • テキスト分割
      • 品詞付与
      • 正規化処理
  • SudachiPy is a Python version of Sudachi, a Japanese morphological analyzer
  • その他

GiNZA

  • GiNZA - Japanese NLP Library
  • 株式会社リクルートと国立国語研究所が共同で開発した自然言語処理のライブラリ
  • spaCy を日本語に対応させたもの
  • 特長 ( 引用 )
    • MIT ライセンスでモデルを含めて商用利用可能
    • BCCWJ 由来の依存構造解析モデルをフリーで利用可能
    • 他の日本語 UD 解析系が使用する GSD コーパスの 5 倍以上の規模で学習
    • pip 一行ですべて導入完了
    • SudachiPy および 150 万語彙を備える Sudachi 辞書も一括インストール
    • MeCab・CaboCha 等と比較して Docker 等での環境構築が圧倒的に楽
    • spaCy の豊富な機能セットを利用できる
    • 日本語以外の言語モデルへの切り替えが容易 (spaCy 公式サポートは 8 言語)
    • 依存構造解析結果の視覚化
  • GiNZA v3 の固有表現抽出モデルは GSK2014-A (2019) BCCWJ 版 (橋本・乾・村上(2008)) から新聞系文書を除外して学習 (引用)
  • 参考記事: GiNZA+Elasticsearch で係り受け検索の第一歩 - Taste of Tech Topics

NWJC (国語研日本語ウェブコーパス)

Camphr

  • 公式サイト
  • Transformers , Udify, ELmo, などを spaCy で使うためのライブラリ (a spaCy plugin for Transformers, Udify, Elmo, etc.)
  • Source code: PKSHATechnology-Research/camphr
  • 以下のことができる
    • Transformers を使った文章の分散表現への変換 (ベクトル化)
      • 可変長の文章を、固定長のベクトルへ変換する
      • Bert-as-service でやっていることと同じらしい
    • Transformers のファインチューニングによる固有表現抽出とテキスト分類
      • ファインチューニングの学習のためのデータセットを準備する必要がある。
      • データセットさえ用意すれば、Transformers モデルのファインチューニングにより、ネガポジ判定や感情分析もできそうである。
    • Udify: BERT ベースの係り受け解析 (依存関係ラベリング)
      • 日本語にも対応している
      • mecab-python3、allennlp を内部で利用している
  • 参考記事: Camphr: spaCy plugin for Transformers, Udify, KNP - Qiita

その他

感想

  • 国立国語研究所、リクルート、ワークスアプリケーションズがかなり頑張って日本語言語処理基盤を整理してくれているという印象

hnishi

hnishi のブログ

ソフトウェアエンジニアです。
誰かの役に立つかもしれないと思って、調べたこと、勉強したこと、躓いた箇所などを記事にしています。
問い合わせはこちらからお願いします。