50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import unittest
|
|
import nltk
|
|
from nltk.grammar import CFG
|
|
|
|
|
|
class ChomskyNormalFormForCFGTest(unittest.TestCase):
|
|
def test_simple(self):
|
|
grammar = CFG.fromstring(
|
|
"""
|
|
S -> NP VP
|
|
PP -> P NP
|
|
NP -> Det N | NP PP P
|
|
VP -> V NP | VP PP
|
|
VP -> Det
|
|
Det -> 'a' | 'the'
|
|
N -> 'dog' | 'cat'
|
|
V -> 'chased' | 'sat'
|
|
P -> 'on' | 'in'
|
|
"""
|
|
)
|
|
self.assertFalse(grammar.is_flexible_chomsky_normal_form())
|
|
self.assertFalse(grammar.is_chomsky_normal_form())
|
|
grammar = grammar.chomsky_normal_form(flexible=True)
|
|
self.assertTrue(grammar.is_flexible_chomsky_normal_form())
|
|
self.assertFalse(grammar.is_chomsky_normal_form())
|
|
|
|
grammar2 = CFG.fromstring(
|
|
"""
|
|
S -> NP VP
|
|
NP -> VP N P
|
|
VP -> P
|
|
N -> 'dog' | 'cat'
|
|
P -> 'on' | 'in'
|
|
"""
|
|
)
|
|
self.assertFalse(grammar2.is_flexible_chomsky_normal_form())
|
|
self.assertFalse(grammar2.is_chomsky_normal_form())
|
|
grammar2 = grammar2.chomsky_normal_form()
|
|
self.assertTrue(grammar2.is_flexible_chomsky_normal_form())
|
|
self.assertTrue(grammar2.is_chomsky_normal_form())
|
|
|
|
def test_complex(self):
|
|
grammar = nltk.data.load('grammars/large_grammars/atis.cfg')
|
|
self.assertFalse(grammar.is_flexible_chomsky_normal_form())
|
|
self.assertFalse(grammar.is_chomsky_normal_form())
|
|
grammar = grammar.chomsky_normal_form(flexible=True)
|
|
self.assertTrue(grammar.is_flexible_chomsky_normal_form())
|
|
self.assertFalse(grammar.is_chomsky_normal_form())
|