7rpn’s blog: うわああああな日常

好きなことをつらつらと。

Pythonで文脈自由文法

大学院の課題で"文脈自由文法による構文解析を実装せよ. プログラミング言語は問わない"って課題が出されました。

超簡単だったけれど,日本語のドキュメントないっぽいのでメモ。
来年も同じ課題が出て,検索をかけた人用に書き残しておきます。笑

いわゆる文理融合の新しい分野()を学ぶ研究科の,文系の授業の最終課題のひとつとして出たものです。 選択課題の一つで,レポートの課題もあったのですが,レポートを書くって非生産的であまり好きではないので。
そういうわけで,構文解析を実装してみました。 pip install nltkして,以下を実行するだけ。超楽。

分析器には,"I thought about your smile in tears."って文章を突っ込みました。 恋人と別れたばかりでちょっとセンチな言葉を選びたかったり。笑

import nltk
#Copyright (C) 2001-2015 NLTK Project.

phrase = ['I','thought','about','your','smile','in','tears']

parser = nltk.CFG.fromstring("""
S -> NP VP
PP -> P NP
NP -> Det N | Det N PP | N | N PP |
VP -> V  | VP PP
Det ->  'my' | 'your'
N -> 'you' |'I' |'smile'| 'tears'
V -> 'thought'
P -> 'in' | 'about'
""")

for x in parser.parse(phrase):
    print(x)

ちゃんと二通りの答えが返ってくる。すごい

(S
  (NP (N I))
  (VP
    (VP (VP (V thought)) (PP (P about) (NP (Det your) (N smile))))
    (PP (P in) (NP (N tears)))))
(S
  (NP (N I))
  (VP
    (VP (V thought))
    (PP
      (P about)
      (NP (Det your) (N smile) (PP (P in) (NP (N tears)))))))

"your smile is literally the cutest thing i had ever seen my life"って文章を構文解析したかったけれど,意味不明になってやめました。
東大の構文解析機に突っ込んでも間違ってたし。いや俺の文章理解が間違ってるのか?

grammar部分に構文の法則突っ込んで,その法則から文章を分析するっていうなんとも簡単な。
ただ奥が深そうだなぁとは思います。

授業ほぼ行かなかったのに課題をソースコードと文章三行くらいで提出したのでさすがになめてるw

英語苦手だし今のところ良い応用も思い浮かばないので,こんな感じで適当に終えます。
形態素解析とか今はMecab叩けば一瞬で終わっちゃうのがすごいなぁと思います。日本語の分析ってめちゃ難しそうなのに。研究者頑張れ。