文節APIの解説
GiNZAの解析モデルと文節単位の解析API
GiNZA独自の文節解析モデルにより、Universal Dependenciesの枠組みの中で日本語に特徴的な文節構造を考慮することができます。
また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の文節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() | デフォルトの分割モードの変更。 | |
Clause | ||
clauses() | 節単位に分割されたトークン列。(experimental) | |
clause_head() | トークンが属する節のヘッドとなるトークン。(experimental) | |
clause_head_i() | トークンが属する節のヘッドとなるトークン番号。(experimental) |
解説資料
詳細な解説はこちらの記事をご覧ください。