大学の研究に際してGiNZAにふれる機会が合ったので備忘録的に書いておきます
#環境
- Python 3.6.8
- pyenv 1.2.24.1-6-g132d5464
- pip 21.0.1
install
公式のgithubを見てインストールしました
(面倒な人へ)インストールコマンド
pip install -U ginza
ロードと解析
こんな感じのプログラム書いてみました.昨日から胃がキリキリと痛い
という文の形態素解析をしてもらいましょう
program
analy.py
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')
output
$ python analy.py
0 昨日 昨日 NOUN 名詞-普通名詞-副詞可能 obl 6
1 から から ADP 助詞-格助詞 case 0
2 胃 胃 NOUN 名詞-普通名詞-一般 nsubj 6
3 が が ADP 助詞-格助詞 case 2
4 キリキリ キリキリ NOUN 名詞-普通名詞-一般 obl 6
5 と と ADP 助詞-格助詞 case 4
6 痛い 痛い ADJ 形容詞-一般 ROOT 6
7 。 。 PUNCT 補助記号-句点 punct 6
EOS
左から単語・見出し語・品詞タグ・品詞情報・依存関係ラベル・係り先の単語インデックスを表示しています.
この中にあるNOUN・ADPやnmod・nsubjという文字列はUniversal Dependencyというプロジェクトで定義されているラベルらしいです
主語と述語を抜き出す
nsubjというラベルが主語述語の係り受けなので,nsubjのラベルを持っているトークンと係り受け先のトークンをペアとします.
program
nsubj.py
import spacy
def parse_document(sentence, nlp):
doc = nlp(sentence)
tokens = []
for sent in doc.sents:
for token in sent:
tokens.append(token)
subject_list = []
for token in tokens:
## 依存関係ラベルがnsubj=>「<見出し語>:<係り先の見出し語>」をリストに追加する。
if token.dep_ in ["nsubj", "iobj"]:
subject_list.append(f"{token.lemma_}:{tokens[token.head.i].lemma_}")
return subject_list
## ここからメイン
nlp = spacy.load('ja_ginza')
print(parse_document("昨日から胃がキリキリと痛い。ただ、熱は無い。", nlp))
output
$ python nsubj.py
['胃:痛い', '熱:無い']