【问题标题】:How to check two POS tags are in the same category in NLTK?如何在 NLTK 中检查两个 POS 标签是否属于同一类别?
【发布时间】:2016-09-21 00:46:26
【问题描述】:

如标题所说,如何检查两个 POS 标签是否属于同一类别?

例如,

go -> VB
goes -> VBZ

这两个词都是动词。或者,

bag -> NN
bags -> NNS

这两个都是名词。 所以我的问题是,NLTK 中是否存在任何函数来检查两个给定标签是否属于同一类别?

【问题讨论】:

    标签: python nltk pos-tagger


    【解决方案1】:

    让我们先来看一个简单的例子:你的语料库被标记为 Brown 标记集(就是它的样子),你会对 nltk 的 "universal" tagset:., ADJ, ADP, ADV, CONJ, DET, NOUN, NUM, PRON, PRT, VERB, X 中定义的简单标记感到满意,其中点代表“标点符号”。在这种情况下,只需加载 nltk 的地图并将其与您的数据一起使用:

    tagmap = nltk.tag.mapping.tagset_mapping("en-brown", "universal")
    if tagmap[tag1] == tagmap[tag2]:
        print("The two words have the same part of speech")
    

    如果这不是您的用例,您需要手动决定从每个单独的标签到您想要分配到的简化类别的映射。如果您正在使用 Brown 语料库标签集,您可以看到标签及其含义here, 或从 python 中,如下所示:

    print(nltk.help.brown_tagset())
    

    研究您的标签并定义一个字典,将每个词性标签映射到您选择的类别;人们有时会发现将 Brown 语料库标签按前两个字母分组很有用,将“NN”、“NN$”、“NNS-HL”等放在一起。您可以像这样自动创建这个特定的映射:

    from nltk.corpus import brown
    alltags = set(t for w, t in brown.tagged_words())
    tagmap = dict(t[:2] for t in alltags)
    

    然后你就可以根据自己的需要自定义这张地图了;例如,将所有标点符号放在“.”类别中:

    for tag in tagmap:
        if not tag.isalpha():
            tagmap[tag] = "."
    

    一旦您的tagmap 符合您的喜好,就可以像我从nltk 导入的那个一样使用它。

    最后,您可能会发现一次性重新标记整个语料库很方便,这样您就可以简单地比较分配的标签。如果corpus 是nltk 的<corpus>.tagged_sents() 命令格式的标记句子列表(所以不是语料库阅读器对象),您可以像这样重新标记所有内容:

    newcorpus = []
    for sent in corpus:
        newcorpus.append( [ (w, tagmap[t]) for w, t in sent ] )
    

    【讨论】:

    • 非常感谢您的详细解释。这正是我所需要的。
    【解决方案2】:

    不确定这是否是您要查找的内容,但您可以使用universal tagset 标记:

    from pprint import pprint
    from collections import defaultdict
    
    from nltk import pos_tag
    from nltk.tokenize import sent_tokenize, word_tokenize
    
    s = "I go. He goes. This bag is brown. These bags are brown."
    
    d = defaultdict(list)
    for sent in sent_tokenize(s):
        text = word_tokenize(sent)
        for value, tag in pos_tag(text, tagset='universal'):
            d[tag].append(value)
    
    pprint(dict(d))
    

    打印:

    {'.': ['.', '.', '.', '.'],
     'ADJ': ['brown'],
     'DET': ['This', 'These'],
     'NOUN': ['bag', 'bags'],
     'PRON': ['I', 'He'],
     'VERB': ['go', 'goes', 'is', 'brown', 'are']}
    

    注意bagbags 属于NOUN 类别,gogoes 属于VERB

    【讨论】:

    • 非常感谢!这是一个很好的方法,但我的情况有点不同。我得到的信息是一组标签。我需要将它们聚集到不同的集合中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多