Преобразование POS-тегов из TextBlob в Wordnet-совместимые входы
Я использую Python и nltk + Textblob для анализа текста. Интересно, что вы можете добавить POS для wordnet, чтобы сделать поиск синонимов более конкретным, но, к сожалению, теги как в nltk, так и в Textblob не "совместимы" с тем типом ввода, который wordnet ожидает для своего класса synset.
Пример Wordnet.synsets() требует, чтобы POS, который вы предоставляете, был одним из n, v, a, r, вот так
wn.synsets("dog", POS="n,v,a,r")
Но стандартная маркировка POS от upenn_treebank выглядит так
JJ, VBD, VBZ, etc.
Поэтому я ищу хороший способ конвертировать между ними.
Кто-нибудь знает хороший способ сделать это преобразование, кроме грубой силы?
2 ответа
Если textblob
использует набор тегов PennTreeBank (ptb), затем просто используйте первый символ в теге POS для сопоставления с тегом pos WN.
Набор тегов WN POS включает "a" = прилагательное / наречие, "s" = спутниковое прилагательное, "n" = существительные и "v" = глаголы.
пытаться:
>>> from nltk import word_tokenize, pos_tag
>>> from nltk.corpus import wordnet as wn
>>> text = 'this is a pos tagset in some foo bar paradigm'
>>> pos_tag(word_tokenize(text))
[('this', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('pos', 'NN'), ('tagset', 'NN'), ('in', 'IN'), ('some', 'DT'), ('foo', 'NN'), ('bar', 'NN'), ('paradigm', 'NN')]
>>> for tok, pos in pos_tag(word_tokenize(text)):
... pos = pos[0].lower()
... if pos in ['a', 'n', 'v']:
... wn.synsets(tok, pos)
...
[Synset('be.v.01'), Synset('be.v.02'), Synset('be.v.03'), Synset('exist.v.01'), Synset('be.v.05'), Synset('equal.v.01'), Synset('constitute.v.01'), Synset('be.v.08'), Synset('embody.v.02'), Synset('be.v.10'), Synset('be.v.11'), Synset('be.v.12'), Synset('cost.v.01')]
[Synset('polonium.n.01'), Synset('petty_officer.n.01'), Synset('po.n.03'), Synset('united_states_post_office.n.01')]
[]
[]
[Synset('barroom.n.01'), Synset('bar.n.02'), Synset('bar.n.03'), Synset('measure.n.07'), Synset('bar.n.05'), Synset('prevention.n.01'), Synset('bar.n.07'), Synset('bar.n.08'), Synset('legal_profession.n.01'), Synset('stripe.n.05'), Synset('cake.n.01'), Synset('browning_automatic_rifle.n.01'), Synset('bar.n.13'), Synset('bar.n.14'), Synset('bar.n.15')]
[Synset('paradigm.n.01'), Synset('prototype.n.01'), Synset('substitution_class.n.01'), Synset('paradigm.n.04')]
Вот простая функция для преобразования тегов U Penn Treebank в теги Wordnet (a,v, r, n):
Penn2Wn = lambda t='VB': t[0].lower() if t[0] in ('V','R','J') else 'n'
Как и в сообщении @alvas, он принимает младший из первого символа, если это необходимо, или
'n'
по умолчанию. Вы можете проверить это с помощью:
Penn2Wn('VB')
Penn2Wn('PRP')