2015-06-11 2 views
3

Я использую Brown Corpus. Мне нужен способ распечатать все возможные теги и их имена (а не только аббревиатуры тегов). Есть также немало тегов, есть ли способ «упростить» теги? По упрощению я имею в виду объединение двух очень похожих тегов в один и повторное теги слияния слов с другим тегом?NLTK - Получить и упростить список тегов

ответ

4

Это как-то обсуждалось ранее:

плазменный вывод теги из nltk.pos_tag являются PennTreeBank множества ярлыков, https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html см What are all possible pos tags of NLTK?

Есть несколько подход, но самым простым было бы использовать только первые 2 символа POS в качестве основного набора POS-тегов. Это связано с тем, что первые два символа в теге POS представляют собой широкие классы POS в тегах Penn Tree Bank.

Например, NNS означает множественное существительное, а NNP означает собственное имя, а тэг NN объединяет все его, представляя родовое существительное.

Вот пример кода:

>>> from nltk.corpus import brown 
>>> from collections import Counter 

>>> x = defaultdict(list) 
>>> for word,pos in brown.tagged_words()[1:100]: 
...  x[pos].append(word) 
... 
>>> x 
defaultdict(<type 'list'>, {u'DTI': [u'any'], u'BEN': [u'been'], u'VBD': [u'said', u'produced', u'took', u'said'], u'NP$': [u"Atlanta's"], u'NN-TL': [u'County', u'Jury', u'City', u'Committee', u'City', u'Court', u'Judge', u'Mayor-nominate'], u'VBN': [u'conducted', u'charged', u'won'], u"''": [u"''", u"''", u"''"], u'WDT': [u'which', u'which', u'which'], u'JJ': [u'recent', u'over-all', u'possible', u'hard-fought'], u'VBZ': [u'deserves'], u'NN': [u'investigation', u'primary', u'election', u'evidence', u'place', u'jury', u'term-end', u'charge', u'election', u'praise', u'manner', u'election', u'term', u'jury', u'primary'], u',': [u',', u','], u'.': [u'.', u'.'], u'TO': [u'to'], u'NP': [u'September-October', u'Durwood', u'Pye', u'Ivan'], u'BEDZ': [u'was', u'was'], u'NR': [u'Friday'], u'NNS': [u'irregularities', u'presentments', u'thanks', u'reports', u'irregularities'], u'``': [u'``', u'``', u'``'], u'CC': [u'and'], u'RBR': [u'further'], u'AT': [u'an', u'no', u'The', u'the', u'the', u'the', u'the', u'the', u'the', u'The', u'the'], u'IN': [u'of', u'in', u'of', u'of', u'for', u'in', u'by', u'of', u'in', u'by'], u'CS': [u'that', u'that'], u'NP-TL': [u'Fulton', u'Atlanta', u'Fulton'], u'HVD': [u'had', u'had'], u'IN-TL': [u'of'], u'VB': [u'investigate'], u'JJ-TL': [u'Grand', u'Executive', u'Superior']}) 
>>> len(x) 
29 

укоротить версия выглядит следующим образом:

>>> x = defaultdict(list) 
>>> for word,pos in brown.tagged_words()[1:100]: 
...  x[pos[:2]].append(word) 
... 
>>> x 
defaultdict(<type 'list'>, {u'BE': [u'was', u'been', u'was'], u'VB': [u'said', u'produced', u'took', u'said', u'deserves', u'conducted', u'charged', u'investigate', u'won'], u'WD': [u'which', u'which', u'which'], u'RB': [u'further'], u'NN': [u'County', u'Jury', u'investigation', u'primary', u'election', u'evidence', u'irregularities', u'place', u'jury', u'term-end', u'presentments', u'City', u'Committee', u'charge', u'election', u'praise', u'thanks', u'City', u'manner', u'election', u'term', u'jury', u'Court', u'Judge', u'reports', u'irregularities', u'primary', u'Mayor-nominate'], u'TO': [u'to'], u'CC': [u'and'], u'HV': [u'had', u'had'], u'``': [u'``', u'``', u'``'], u',': [u',', u','], u'.': [u'.', u'.'], u"''": [u"''", u"''", u"''"], u'CS': [u'that', u'that'], u'AT': [u'an', u'no', u'The', u'the', u'the', u'the', u'the', u'the', u'the', u'The', u'the'], u'JJ': [u'Grand', u'recent', u'Executive', u'over-all', u'Superior', u'possible', u'hard-fought'], u'IN': [u'of', u'in', u'of', u'of', u'of', u'for', u'in', u'by', u'of', u'in', u'by'], u'NP': [u'Fulton', u"Atlanta's", u'Atlanta', u'September-October', u'Fulton', u'Durwood', u'Pye', u'Ivan'], u'NR': [u'Friday'], u'DT': [u'any']}) 
>>> len(x) 
19 

Другим решением является использование универсальных postags см http://www.nltk.org/book/ch05.html

>>> x = defaultdict(list) 
>>> for word,pos in brown.tagged_words(tagset='universal')[1:100]: 
...  x[pos].append(word) 
... 
>>> x 
defaultdict(<type 'list'>, {u'ADV': [u'further'], u'NOUN': [u'Fulton', u'County', u'Jury', u'Friday', u'investigation', u"Atlanta's", u'primary', u'election', u'evidence', u'irregularities', u'place', u'jury', u'term-end', u'presentments', u'City', u'Committee', u'charge', u'election', u'praise', u'thanks', u'City', u'Atlanta', u'manner', u'election', u'September-October', u'term', u'jury', u'Fulton', u'Court', u'Judge', u'Durwood', u'Pye', u'reports', u'irregularities', u'primary', u'Mayor-nominate', u'Ivan'], u'ADP': [u'of', u'that', u'in', u'that', u'of', u'of', u'of', u'for', u'in', u'by', u'of', u'in', u'by'], u'DET': [u'an', u'no', u'any', u'The', u'the', u'which', u'the', u'the', u'the', u'the', u'which', u'the', u'The', u'the', u'which'], u'.': [u'``', u"''", u'.', u',', u',', u'``', u"''", u'.', u'``', u"''"], u'PRT': [u'to'], u'VERB': [u'said', u'produced', u'took', u'said', u'had', u'deserves', u'was', u'conducted', u'had', u'been', u'charged', u'investigate', u'was', u'won'], u'CONJ': [u'and'], u'ADJ': [u'Grand', u'recent', u'Executive', u'over-all', u'Superior', u'possible', u'hard-fought']}) 
>>> len(x) 
9 
+1

Я напечатал общее количество «тегов» в коричневом корпусе, и это дало мне 472. Я предполагаю, что это связано с тем, что существует несколько комбинаций тегов? Например, NP + HVZ-NC? Это означает, что это слово, возможно, является одним из двух тегов?При сокращении этих тегов pos [: 2] он явно отключает теги, такие как «FW-AT + NP-TL», только FW. Это абсурдно специфический тег. Я действительно искал счастливую среду между универсальными и коричневыми бирками. Используя [: 2], я получаю в общей сложности 49, что является большим числом, я думаю. Хотя есть и такие странные теги, как «) -« –

2

Многие из тегов в NLTK корпуса имеют предопределенные сопоставления с упрощенным «универсальным» набором тегов. В дополнение к более удобному для многих целей упрощенный набор меток позволяет достичь степени совместимости между различными корпусами, которые позволяют переназначить универсальный набор тегов.

Для коричневого корпуса, вы можете просто принести маркированные слова или сенты, как это:

brown.tagged_words(tagset="universal") 

Например:

>>> print(brown.tagged_words()[:10]) 
[('The', 'DET'), ('Fulton', 'NOUN'), ('County', 'NOUN'), ('Grand', 'ADJ'), ('Jury', 'NOUN'), 
('said', 'VERB'), ('Friday', 'NOUN'), ('an', 'DET'), ('investigation', 'NOUN'), 
('of', 'ADP')] 

Чтобы увидеть определение исходных сложных тегов в Брауне corpus, используйте nltk.help.upenn_tagset() (как упоминалось также в this ответах, связанных Alvas). Вы можете получить весь список, вызвав его без аргументов или передать аргумент (regexp), чтобы получить только соответствующий тег (ы). Результаты включают краткое определение и примеры.

>>> nltk.help.brown_tagset("DT.*") 
DT: determiner/pronoun, singular 
    this each another that 'nother 
DT$: determiner/pronoun, singular, genitive 
    another's 
DT+BEZ: determiner/pronoun + verb 'to be', present tense, 3rd person singular 
    that's 
DT+MD: determiner/pronoun + modal auxillary 
    that'll this'll 
...