日本語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")

参考資料


私にカフェオレを飲ませるためにサポートしてみませんか?