GiNZA logo

GiNZAの公開ページ

TweetDownloads

What’s new!

Megagon Labs Blogで GiNZA version 4.0: 多言語依存構造解析技術への文節APIの統合 が公開されました。

GiNZAをアップグレードする際は 重要な変更 の記述をご確認ください。

Breaking Changes in v4.0

GiNZA v4の解析モデルと文節単位の解析API

新しいGiNZAの解析モデルにより、Universal Dependenciesの枠組みの中で日本語に特徴的な文節構造を考慮することができます。

bunsetu_heads

またGiNZA v4で追加された解析APIを用いることで、文節やその主辞を単位とした分析がこれまでよりずっと容易になります。

from ginza import *
import spacy
nlp = spacy.load("ja_ginza")  # GiNZAモデルの読み込み

from collections import defaultdict
frames = defaultdict(lambda: 0)  # 依存関係の出現頻度を格納
sentences = set()  # 重複文検出用のset

with open("sentences.txt", "r") as fin:  # 解析対象のテキストファイルから
  for line in fin:  # 一行ごとに
    try:
      doc = nlp(line.rstrip())  # 解析を実行し
    except:
      continue
    for sent in doc.sents:  # 文単位でループ
      if sent.text in sentences:
        continue  # 重複文はスキップ
      sentences.add(sent.text)
      for t in bunsetu_head_tokens(sent):  # 文節主辞トークンのうち
        if t.pos_ not in {"ADJ", "VERB"}:
          continue  # 述語以外はスキップ
        v = phrase(lemma_)(t)  # 述語とその格要素(主語・目的語相当)の句を集める
        dep_phrases = sub_phrases(t, phrase(lemma_), is_not_stop)
        subj = [phrase for dep, phrase in dep_phrases if dep in {"nsubj"}]
        obj  = [phrase for dep, phrase in dep_phrases if dep in {"obj", "iobj"}]
        for s in subj:
          for o in obj:
            frames[(s, o, v)] += 1  # 格要素と述語の組み合わせをカウント

for frame, count in sorted(frames.items(), key=lambda t: -t[1]):
  print(count, *frame, sep="\t")  # 出現頻度の高い順に表示

表1 GiNZA v4で追加された文節APIの一覧

category func or variable description
Span-based    
  bunsetu_spans() 文節SpanのIterable。
  bunsetu_phrase_spans() 文節主辞SpanのIterable。
  bunsetu_span() トークンが属する文節のSpan。
  bunsetu_phrase_span() トークンが属する文節の主辞Span。
Construction    
  bunsetu() 文節中のトークン列を指定された形に整形して返す。
  phrase() 文節主辞中のトークン列を指定された形に整形して
返す。
  sub_phrases() 従属文節を指定された形に整形して返す。
  phrases() スパンに含まれる文節を指定された形に整形して
返す。
Utility    
  traverse() 構文木を指定された方法で巡回し指定された形に
整形して返す。
  default_join_func() デフォルトのトークン列の結合方法。
  SEP デフォルトのトークン区切り文字。
Token-based    
  bunsetu_head_list() DocやSpanに含まれる文節のヘッドトークンの
インデックスのリスト。
  bunsetu_head_tokens() DocやSpanに含まれる文節のヘッドトークンの
リスト。
  bunsetu_bi_labels() DocやSpanに含まれるトークンが文節開始位置
にある場合は”B”、それ以外は”I”とするリスト。
  bunsetu_position_types() DocやSpanに含まれるトークンを{“ROOT”,
“SEM_HEAD”, “SYN_HEAD”, “NO_HEAD”,
“FUNC”, “CONT”}に分類したリスト。
  is_bunsetu_head() トークンが文節のヘッドの場合はTrue、
それ以外はFalse。
  bunsetu_bi_label() トークンが文節開始位置にある場合は”B”、
それ以外は”I”。
  bunsetu_position_type() トークンを{“ROOT”, “SEM_HEAD”,
“SYN_HEAD”, “NO_HEAD”, “FUNC”,
“CONT”}に分類。
Proxy    
  * spacy.tokens.Tokenクラスのプロパティと
同名・同機能の関数群。
Subtoken    
  sub_tokens() トークンの分割情報。
  set_split_mode() デフォルトの分割モードの変更。

解説資料

ライセンス

GiNZA NLPライブラリおよびGiNZA日本語Universal Dependenciesモデルは The MIT Licenseのもとで公開されています。 利用にはThe MIT Licenseに合意し、規約を遵守する必要があります。

spaCy

GiNZAはspaCyをNLP Frameworkとして使用しています。

spaCy LICENSE PAGE

Sudachi/SudachiPy - SudachiDict - chiVe

GiNZAはトークン化(形態素解析)処理にSudachiPyを使用することで、高い解析精度を得ています。

Sudachi LICENSE PAGE, SudachiPy LICENSE PAGE

SudachiDict LEGAL PAGE

chiVe LICENSE PAGE

訓練コーパス

UD Japanese BCCWJ v2.6

GiNZA v4 の依存構造解析モデルは UD Japanese BCCWJ v2.6 (Omura and Asahara:2018) から新聞系文書を除外して学習しています。 本モデルは国立国語研究所とMegagon Labsの共同研究成果です。

GSK2014-A (2019) BCCWJ版

GiNZA v4 の固有表現抽出モデルは GSK2014-A (2019) BCCWJ版 (橋本・乾・村上(2008)) から新聞系文書を除外して学習しています。 固有表現抽出ラベル体系は関根の拡張固有表現階層、 および、OntoNotes5 を独自に拡張したものを併用しています。 本モデルは国立国語研究所とMegagon Labsの共同研究成果です。

実行環境

このプロジェクトは Python 3.6以上(および対応するpip)で動作検証を行っています。

(開発環境についての詳細はこちら)

実行環境のセットアップ

1. GiNZA NLPライブラリと日本語Universal Dependenciesモデルのインストール

最新版をインストールするにはコンソールで次のコマンドを実行します。

$ pip install -U ginza

Google Colab 環境ではインストール後にパッケージ情報の再読込が必要な場合があります。詳細はリンクの記事をご確認下さい。

import pkg_resources, imp
imp.reload(pkg_resources)

【GiNZA】GoogleColabで日本語NLPライブラリGiNZAがloadできない

インストール時にCythonに関するエラーが発生した場合は、次のように環境変数CFLAGSを設定してください。

$ CFLAGS='-stdlib=libc++' pip install ginza

2. ginzaコマンドの実行

コンソールで次のコマンドを実行して、日本語の文に続けてEnterを入力すると、CoNLL-U Syntactic Annotation 形式で解析結果が出力されます。

$ ginza
銀座でランチをご一緒しましょう。
# text = 銀座でランチをご一緒しましょう。
1	銀座	銀座	PROPN	名詞-固有名詞-地名-一般	_	6	obl	_	SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|NP_B|Reading=ギンザ|NE=B-GPE|ENE=B-City
2	で	で	ADP	助詞-格助詞	_	1	case	_	SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Reading=デ
3	ランチ	ランチ	NOUN	名詞-普通名詞-一般	_	6	obj	_	SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|NP_B|Reading=ランチ
4	を	を	ADP	助詞-格助詞	_	3	case	_	SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Reading=ヲ
5	ご	ご	NOUN	接頭辞	_	6	compound	_	SpaceAfter=No|BunsetuBILabel=B|BunsetuPositionType=CONT|Reading=ゴ
6	一緒	一緒	VERB	名詞-普通名詞-サ変可能	_	0	root	_	SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=ROOT|Reading=イッショ
7	し	する	AUX	動詞-非自立可能	_	6	advcl	_	SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Inf=サ行変格,連用形-一般|Reading=シ
8	ましょう	ます	AUX	助動詞	_	6	aux	_	SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|Inf=助動詞-マス,意志推量形|Reading=マショウ
9	。	。	PUNCT	補助記号-句点	_	6	punct	_	SpaceAfter=No|BunsetuBILabel=I|BunsetuPositionType=CONT|Reading=。

ginzameコマンドでオープンソース形態素解析エンジン MeCabmecabコマンドに近い形式で解析結果を出力することができます。 ginzameコマンドは形態素解析処理のみをマルチプロセスで高速に実行します。 このコマンドとmecabの出力形式の相違点として、 最終フィールド(発音)が常に*となることに注意して下さい。

$ ginzame
銀座でランチをご一緒しましょう。
銀座	名詞,固有名詞,地名,一般,*,*,銀座,ギンザ,*
で	助詞,格助詞,*,*,*,*,で,デ,*
ランチ	名詞,普通名詞,一般,*,*,*,ランチ,ランチ,*
を	助詞,格助詞,*,*,*,*,を,ヲ,*
ご	接頭辞,*,*,*,*,*,御,ゴ,*
一緒	名詞,普通名詞,サ変可能,*,*,*,一緒,イッショ,*
し	動詞,非自立可能,*,*,サ行変格,連用形-一般,為る,シ,*
ましょう	助動詞,*,*,*,助動詞-マス,意志推量形,ます,マショウ,*
。	補助記号,句点,*,*,*,*,。,。,*
EOS

spaCyの学習用JSON形式での出力はginza -f 3 または ginza -f jsonを実行してください。

$ ginza -f json
銀座でランチをご一緒しましょう。
[
 {
  "paragraphs": [
   {
    "raw": "銀座でランチをご一緒しましょう。",
    "sentences": [
     {
      "tokens": [
       {"id": 1, "orth": "銀座", "tag": "名詞-固有名詞-地名-一般", "pos": "PROPN", "lemma": "銀座", "head": 5, "dep": "obl", "ner": "B-City"},
       {"id": 2, "orth": "で", "tag": "助詞-格助詞", "pos": "ADP", "lemma": "で", "head": -1, "dep": "case", "ner": "O"},
       {"id": 3, "orth": "ランチ", "tag": "名詞-普通名詞-一般", "pos": "NOUN", "lemma": "ランチ", "head": 3, "dep": "obj", "ner": "O"},
       {"id": 4, "orth": "を", "tag": "助詞-格助詞", "pos": "ADP", "lemma": "を", "head": -1, "dep": "case", "ner": "O"},
       {"id": 5, "orth": "ご", "tag": "接頭辞", "pos": "NOUN", "lemma": "ご", "head": 1, "dep": "compound", "ner": "O"},
       {"id": 6, "orth": "一緒", "tag": "名詞-普通名詞-サ変可能", "pos": "VERB", "lemma": "一緒", "head": 0, "dep": "ROOT", "ner": "O"},
       {"id": 7, "orth": "し", "tag": "動詞-非自立可能", "pos": "AUX", "lemma": "する", "head": -1, "dep": "advcl", "ner": "O"},
       {"id": 8, "orth": "ましょう", "tag": "助動詞", "pos": "AUX", "lemma": "ます", "head": -2, "dep": "aux", "ner": "O"},
       {"id": 9, "orth": "。", "tag": "補助記号-句点", "pos": "PUNCT", "lemma": "。", "head": -3, "dep": "punct", "ner": "O"}
      ]
     }
    ]
   }
  ]
 }
]

日本語係り受け解析器 CaboChacabocha -f1のラティス形式に近い解析結果を出力する場合は ginza -f 1 または ginza -f cabocha を実行して下さい。 このオプションとcabocha -f1の出力形式の相違点として、 スラッシュ記号/に続くfunc_indexフィールドが常に自立語の終了位置(機能語があればその開始位置に一致)を示すこと、 機能語認定基準が一部異なること、 に注意して下さい。

$ ginza -f cabocha
銀座でランチをご一緒しましょう。
* 0 2D 0/1 0.000000
銀座	名詞,固有名詞,地名,一般,,銀座,ギンザ,*	B-City
で	助詞,格助詞,*,*,,で,デ,*	O
* 1 2D 0/1 0.000000
ランチ	名詞,普通名詞,一般,*,,ランチ,ランチ,*	O
を	助詞,格助詞,*,*,,を,ヲ,*	O
* 2 -1D 0/2 0.000000
ご	接頭辞,*,*,*,,ご,ゴ,*	O
一緒	名詞,普通名詞,サ変可能,*,,一緒,イッショ,*	O
し	動詞,非自立可能,*,*,サ行変格,連用形-一般,する,シ,*	O
ましょう	助動詞,*,*,*,助動詞-マス,意志推量形,ます,マショウ,*	O
。	補助記号,句点,*,*,,。,。,*	O
EOS

マルチプロセス実行 (Experimental)

-p NUM_PROCESS オプションで解析処理のマルチプロセス実行が可能になります。 NUM_PROCESSには並列実行するプロセス数を整数で指定します。 0以下の値は実行環境のCPUコア数+NUM_PROCESSを指定したのと等価になります。

ginza -f mecabとそのエイリアスであるginzame以外で-p NUM_PROCESSオプションを使用する場合は、 実行環境の空きメモリ容量が十分あることを事前に確認してください。 マルチプロセス実行では1プロセスあたり約130MBのメモリが必要です。(今後のリリースで改善予定)

コーディング例

次のコードは文単位で依存構造解析結果を出力します。

import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('銀座でランチをご一緒しましょう。')
for sent in doc.sents:
    for token in sent:
        print(token.i, token.orth_, token.lemma_, token.pos_, token.tag_, token.dep_, token.head.i)
    print('EOS')

API

基本的な解析APIは spaCy API documents を参照してください。 その他、詳細についてはドキュメントが整備されるまでお手数ですがソースコードをご確認ください。

ユーザ辞書の使用

GiNZAはTokenizer(形態素解析レイヤ)にSudachiPyを使用しています。 GiNZAでユーザ辞書を使用するにはSudachiPyの辞書設定ファイル sudachi.jsonuserDict フィールドに、 コンパイル済みのユーザ辞書ファイルのパスのリストを指定します。

SudachiPyのユーザ辞書ファイルのコンパイル方法についてはSudachiPyのGitHubリポジトリで公開されているドキュメントを参照してください。
SudachiPy - User defined Dictionary
Sudachi ユーザー辞書作成方法

リリース履歴

version 4.x

ginza-4.0.6

ginza-4.0.5

ginza-4.0.4

ginza-4.0.3

ginza-4.0.2

ginza-4.0.1

ginza-4.0.0

version 3.x

ginza-3.1.2

ginza-3.1.1

import spacy
import pickle
nlp = spacy.load('ja_ginza')
doc1 = nlp('この例は正しくserializeされます。')
doc1.to_bytes()
with open('sample1.pickle', 'wb') as f:
    pickle.dump(doc1, f)

nlp.tokenizer.set_enable_ex_sudachi(True)
doc2 = nlp('この例ではserialize時にエラーが発生します。')
doc2.to_bytes()
with open('sample2.pickle', 'wb') as f:
    pickle.dump(doc2, f)

ginza-3.1.0

ginza-3.0.0

version 2.x

ginza-2.2.1

ginza-2.2.0

ginza-2.0.0

version 1.x

ja_ginza_nopn-1.0.2

ja_ginza_nopn-1.0.1

ja_ginza_nopn-1.0.0

開発環境

開発環境のセットアップ

1. githubからclone

$ git clone 'https://github.com/megagonlabs/ginza.git'

2. pip install および setup.sh の実行

$ pip install -U -r requirements.txt
$ python setup.py develop

3. GPU用ライブラリのセットアップ (Optional)

CUDA v10.1の場合は次のように指定します。

$ pip install -U thinc[cuda101]

訓練の実行

GiNZAの解析モデル ja_ginza はspaCy標準コマンドを使用して学習を行っています。

$ python -m spacy train ja ja_ginza-4.0.0 corpus/ja_ginza-ud-train.json corpus/ja_ginza-ud-dev.json -b ja_vectors_chive_mc90_35k/ -ovl 0.3 -n 100 -m meta.json.ginza -V 4.0.0