将POS标记从TextBlob转换为Wordnet兼容输入

2024-06-16 09:41:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python和nltk+Textblob进行一些文本分析。有趣的是,你可以为wordnet添加一个POS,使你对同义词的搜索更加具体,但不幸的是,nltk和Textblob中的标记与wordnet期望的synset类的输入不“兼容”。在

示例 Wordnet.synsets()要求你给它的POS是n,v,a,r中的一个,像这样

wn.synsets("dog", POS="n,v,a,r")

但是upenn_treebank的标准词性标记看起来像

^{pr2}$

所以我在寻找一个很好的方法在两者之间转换。在

除了暴力之外,还有谁知道让这种转变发生的好方法吗?在


Tags: 方法标记pos文本示例wordnetdog同义词
1条回答
网友
1楼 · 发布于 2024-06-16 09:41:24

如果textblob正在使用penntrebank(ptb)标记集,那么只需使用POS标记中的第一个字符映射到WN POS标记。在

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')]

相关问题 更多 >