使用NLTK获取单词的所有可能的词性标签

时间:2017-11-16 23:17:35

标签: python nltk part-of-speech

有些单词可能有多个可能的词性(pos)标记。 例如。 '棒'既是名词又是动词。

NLTK中的pos标记尝试根据上下文猜测正确的标记,并仅返回1个猜测。如何获取任何给定单词的所有可能标签的列表?

1 个答案:

答案 0 :(得分:1)

TL; DR

不,不适用于默认的pos_tag功能。

在长

对于默认的pos_tag功能,这是不可能的。

默认pos_tag函数来自AveragedPerceptron对象,该对象使用predict()函数来获取最可能的标记:https://github.com/nltk/nltk/blob/develop/nltk/tag/perceptron.py#L48

该函数从可能标记列表中返回argmax:

def predict(self, features):
    '''Dot-product the features and current weights and return the best label.'''
    scores = defaultdict(float)
    for feat, value in features.items():
        if feat not in self.weights or value == 0:
            continue
        weights = self.weights[feat]
        for label, weight in weights.items():
            scores[label] += value * weight
    # Do a secondary alphabetic sort, for stability
    return max(self.classes, key=lambda label: (scores[label], label))

实际上,如果您更改代码,则代码会通过让它返回self.classes来获取每个可能标记的分数。

但是因为tag()中使用的功能需要前两个标记作为功能https://github.com/nltk/nltk/blob/develop/nltk/tag/perceptron.py#L156

def tag(self, tokens):
    '''
    Tag tokenized sentences.
    :params tokens: list of word
    :type tokens: list(str)
    '''
    prev, prev2 = self.START
    output = []

    context = self.START + [self.normalize(w) for w in tokens] + self.END
    for i, word in enumerate(tokens):
        tag = self.tagdict.get(word)
        if not tag:
            features = self._get_features(i, word, context, prev, prev2)
            tag = self.model.predict(features)
        output.append((word, tag))
        prev2 = prev
        prev = tag

    return output

返回n-best标签的任务必须将标签器的简单的一个最好的“贪婪”性质改变为需要光束的东西。