In this section, we will show how feature structures can be constructed and manipulated in NLTK. We will also discuss the fundamental operation of unification, which allows us to combine the information contained in two different feature structures.
Feature structures in NLTK are declared with the
FeatStruct() constructor. Atomic feature values can be strings or
>>> fs1 = nltk.FeatStruct(TENSE='past', NUM='sg') >>> print fs1 [ NUM = 'sg' ] [ TENSE = 'past' ]
A feature structure is actually just a kind of dictionary, and so we access its values by indexing in the usual way. We can use our familiar syntax to assign values to features:
>>> fs1 = nltk.FeatStruct(PER=3, NUM='pl', GND='fem') >>> print fs1['GND'] fem >>> fs1['CASE'] = 'acc'
We can also define feature structures that have complex values, as discussed earlier.
>>> fs2 = nltk.FeatStruct(POS='N', AGR=fs1) >>> print fs2 [ [ CASE = 'acc' ] ] [ AGR = [ GND = 'fem' ] ] [ [ NUM = 'pl' ] ] [ [ PER = 3 ] ] [ ] [ POS = 'N' ] >>> print fs2['AGR'] [ CASE = 'acc' ] [ GND = 'fem' ] [ NUM = 'pl' ] [ PER = 3 ] >>> print fs2['AGR']['PER'] 3
An alternative method of specifying feature structures is to use a
bracketed string consisting of feature-value pairs in the format
feature=value, where values may
themselves be feature structures:
>>> print nltk.FeatStruct("[POS='N', AGR=[PER=3, NUM='pl', GND='fem']]") [ [ PER = 3 ] ] [ AGR = [ GND = 'fem' ] ] [ [ NUM = 'pl' ] ] [ ] [ POS = 'N' ]
Feature structures are ...