【问题标题】:Converting POS tags from TextBlob into Wordnet compatible inputs将 POS 标签从 TextBlob 转换为 Wordnet 兼容的输入
【发布时间】:2014-07-26 20:58:31
【问题描述】:

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

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

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

但是来自 upenn_treebank 的标准 POS 标记看起来像

JJ, VBD, VBZ, etc.

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

除了蛮力之外,有没有人知道实现这种转换的好方法?

【问题讨论】:

  • 您能详细解释一下“不“兼容”吗?
  • 喜欢举个例子...
  • 下面的答案很棒 - 我添加了一些示例,以便偶然发现这篇文章的人可以了解问题所在。

标签: python tags nlp nltk textblob


【解决方案1】:

如果textblob 使用 PennTreeBank (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')]

【讨论】:

  • 这正是我想要的。不知道是否有比仅查看第一个字符更好的解决方案,但似乎这是最好的方法。谢谢!
  • 如果有参考说明这是可用的最佳近似值,会感觉更舒服
  • 这不是错误的吗? PTB 分别对形容词/动词使用以 JJ/RB 开头的标签。我没有测试过,但似乎你必须执行以下操作:ptb_wn_pos { 'NN' : 'n', 'JJ' : 'a', 'RB' : 'a', 'VB' : 'v' } // pos = pos[0:2] // wn_pos = ptb_wn_pos[pos] 编辑:抱歉,由于某种原因我无法插入换行符,所以想象 // 字符是换行符。
【解决方案2】:

这里有一个简单的函数将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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 2023-01-11
    • 1970-01-01
    • 2014-10-12
    • 2013-10-12
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多