日本語NLPライブラリGiNZAの使い方メモ
以下のコードはGiNZAの公式ページより
(主語:s、目的語:o、述語:v)のセットを文章から抜き出す。
from ginza import *
import spacy
nlp = spacy.load("ja_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") # 出現頻度の高い順に表示
構文の依存関係を図示する。
from spacy import displacy
displacy.render(doc, style="dep", options={"compact":True})
固有名詞などを色分けする。
displacy.render(doc, style="ent")
参考資料
私にカフェオレを飲ませるためにサポートしてみませんか?