извлечение фрагментов в python с помощью nltk

скажем, у меня есть тегированный корпус (например, коричневый корпус), и я хочу извлечь слова, которые помечены только «/ nn». Например :

            Daniel/np termed/vbd ``/`` extremely/rb conservative/jj ''/'' his/pp$    estimate/nn.....

это часть помеченного корпуса «коричневый». что я хочу сделать, так это извлечь слова, например, оценка (поскольку они помечены /nn) и добавить их в список. Но большинство примеров, которые я нашел, обычно касаются тегов корпуса. Я действительно запутался, увидев эти примеры. Может ли кто-нибудь помочь мне, предоставив пример или руководство по извлечению слов из помеченного корпуса.

Заранее спасибо.


person user1052462    schedule 25.01.2012    source источник


Ответы (1)


См.: http://nltk.googlecode.com/svn/trunk/doc/book/ch05.html

>>> sent = '''
... The/AT grand/JJ jury/NN commented/VBD on/IN a/AT number/NN of/IN
... other/AP topics/NNS ,/, AMONG/IN them/PPO the/AT Atlanta/NP and/CC
... Fulton/NP-tl County/NN-tl purchasing/VBG departments/NNS which/WDT it/PPS
... said/VBD ``/`` ARE/BER well/QL operated/VBN and/CC follow/VB generally/RB
... accepted/VBN practices/NNS which/WDT inure/VB to/IN the/AT best/JJT
... interest/NN of/IN both/ABX governments/NNS ''/'' ./.
... '''
>>> [nltk.tag.str2tuple(t) for t in sent.split()]
[('The', 'AT'), ('grand', 'JJ'), ('jury', 'NN'), ('commented', 'VBD'),
('on', 'IN'), ('a', 'AT'), ('number', 'NN'), ... ('.', '.')]

Если вам просто нужны те, которые помечены NN, вы можете сделать:

>>> [nltk.tag.str2tuple(t) for t in sent.split() if t.split('/')[1] == 'NN']
[('jury', 'NN'), ('number', 'NN'), ('interest', 'NN')]

Изменить:

Вот sent в виде строки без многоточия.

sent = """The/AT grand/JJ jury/NN commented/VBD on/IN a/AT number/NN of/IN other/AP topics/NNS ,/, AMONG/IN them/PPO the/AT Atlanta/NP and/CC Fulton/NP-tl County/NN-tl purchasing/VBG departments/NNS which/WDT it/PPS said/VBD ``/`` ARE/BER well/QL operated/VBN and/CC follow/VB generally/RB accepted/VBN practices/NNS which/WDT inure/VB to/IN the/AT best/JJT interest/NN of/IN both/ABX governments/NNS ''/'' ./."""
person sgallen    schedule 25.01.2012
comment
спасибо, но если я попытаюсь использовать [nltk.tag.str2tuple(t) для t в sent.split(), если t.split('/')[1] == 'NN'] выдаст ошибку [nltk.tag. str2tuple(t) для t в sent.split() if t.split('/')[1] == 'NN'] IndexError: индекс списка вне допустимого диапазона - person user1052462; 25.01.2012
comment
Странно, что я получаю: [('jury', 'NN'), ('number', 'NN'), ('interest', 'NN')]. Когда вы скопировали отправленное string в моем сообщении, вы пропустили многоточие, то есть .... Я получаю ошибку, которую вы описываете, если вы не вытащите их. - person sgallen; 25.01.2012