2012-01-31 5 views
0

привет, я пытаюсь извлечь собственное имя из меченого корпуса, скажем, например, из nltk tagged corpus brown Я пытаюсь извлечь слова, помеченные только «NP».извлечение из помеченного тела в python

мой код:

import nltk 
    from nltk.corpus import brown 
    f = brown.raw('ca01') 
    print nltk.corpus.brown.tagged_words() 
    w=[nltk.tag.str2tuple(t) for t in f.split()] 
    print w 

но не показывает слова istead это показывает только

[]

пример вывода:

[('The', 'AT'), ('Fulton', 'NP-TL'), ...] 
    [] 

почему это? ?

спасибо.

I я только Прит f.split() .. тогда я получаю

   [('The', 'AT'), ('Fulton', 'NP-TL'), ('County', 'NN-TL'), ('Grand', 'JJ-TL'), ('Jury', 'NN-TL'), ('said', 'VBD'), ('Friday', 'NR'), ('an', 'AT'), ('investigation', 'NN'), ('of', 'IN'), ("Atlanta's", 'NP$'), ('recent', 'JJ'), ('primary', 'NN'), ('election', 'NN'), ('produced', 'VBD'), ('``', '``'), ('no', 'AT'), ('evidence', 'NN'), ("''", "''"), ('that', 'CS'), ('any', 'DTI'), ('irregularities', 'NNS'), ('took', 'VBD'), ('place', 'NN'), ('.', '.'), ('The', 'AT'), ('jury', 'NN'), ('further', 'RBR'), ('said', 'VBD'), ('in', 'IN'), ('term-end', 'NN'), ('presentments', 'NNS'), ('that', 'CS'), ('the', 'AT'), ('City', 'NN-TL')..... 

ответ

4

Не можете сказать, что вы нам дали, но попытались ли вы шаг за шагом перейти к проблеме? Кажется, что ни при каких обстоятельствах t.split('/')[1] == 'NP' не оценивает значение True. Таким образом, вы должны начать:

  1. печати/отладки, чтобы увидеть, что именно делает f.split() содержат
  2. убедитесь, что ваше состояние на самом деле правильный, из небольшого образца продукции вы дали там он смотрит на меня ты больше подходит для: if t.split('/')[1].startswith('NP'), но не может сказать.

EDIT:

Хорошо, первый, если это действительно то, что f.split() печатает на вас, то вы должны получить исключение sicne t является кортеж и кортеж оленьей кожи есть метод split(). Поэтому мне стало интересно, и я установил nltk и загрузил «коричневый» корпус и попробовал свой код. Теперь первый, для меня, если я делаю:

import nltk 
    from nltk.corpus import brown 
    f = brown.raw('ca01') 
    print f.split() 

    ['The/at', 'Fulton/np-tl', 'County/nn-tl', 'Grand/jj-tl', 'Jury/nn-tl', 'said/vbd', 'Friday/nr', 'an/at', 'investigation/nn', 'of/in', "Atlanta's/np$", 'recent/jj', 'primary/nn', 'election/nn', 'produced/vbd', '``/``', 'no/at', 'evidence/nn', "''/''", 'that/cs', 'any/dti', 'irregularities/nns', 'took/vbd', 'place/nn', './.', 'The/at', 'jury/nn', 'further/rbr', 'said/vbd', 'in/in', 'term-end/nn', 'presentments/nns', 'that/cs', 'the/at', 'City/nn-tl', 'Executive/jj-tl', 'Committee/nn-tl', ',/,', 'which/wdt', 'had/hvd', 'over-all/jj', 'charge/nn', 'of/in', 'the/at', 'election/nn', ',/,', '``/``', 'deserves/vbz', 'the/at', 'praise/nn', 'and/cc', 'thanks/nns', 'of/in', 'the/at', 'City/nn-tl' .....] 

Так у меня нет ideea, что вы делали там, чтобы получить результат, но это было неправильно. Теперь, как вы можете видеть из групп, вторая часть слова находится в нижнем регистре, поэтому ваш код не удался. Так что если вы делаете:

w=[nltk.tag.str2tuple(t) for t in f.split() if t.split('/')[1].lower() == 'np'] 

Это поможет вам результат:

[('September-October', 'NP'), ('Durwood', 'NP'), ('Pye', 'NP'), ('Ivan', 'NP'), ('Allen', 'NP'), ('Jr.', 'NP'), ('Fulton', 'NP'), ('Atlanta', 'NP'), ('Fulton', 'NP'), ('Fulton', 'NP'), ('Jan.', 'NP'), ('Fulton', 'NP'), ('Bellwood', 'NP'), ('Alpharetta', 'NP'), ('William', 'NP'), ('B.', 'NP'), ('Hartsfield', 'NP'), ('Pearl', 'NP'), ('Williams', 'NP'), ('Hartsfield', 'NP'), ('Aug.', 'NP'), ('William', 'NP'), ('Berry', 'NP'), ('Jr.', 'NP'), ('Mrs.', 'NP'), ('J.', 'NP'), ('M.', 'NP'), ('Cheshire', 'NP'), ('Griffin', 'NP'), ('Opelika', 'NP'), ('Ala.', 'NP'), ('Hartsfield', 'NP'), ('E.', 'NP'), ('Pelham', 'NP'), ('Henry', 'NP'), ('L.', 'NP'), ('Bowden', 'NP'), ('Hartsfield', 'NP'), ('Atlanta', 'NP'), ('Jan.', 'NP'), ('Ivan', 'NP'), ....] 

Теперь для будущей ссылки двойной проверки, прежде чем публиковать информацию, как тот, который я просил, просто потому, что если это не правильно, то это промахи, и это не поможет ни тем, кто пытается помочь вам, ни себе. Не как критик, а как конструктивный совет :)

+0

, если я попробую номер 2. он показывает тот же ответ, что и я. и результат для f.split приведен выше. – fara

0

Один воображает, что t.split('/')[1] == 'NP' всегда вычисляемая ложно.

+0

ok.but тогда как извлечь слова NP? – fara

+0

@fara: Ты говоришь мне. Если это ваш вопрос, задайте новый вопрос. – Marcin

Смежные вопросы