NLTK最大熵分类器原始分数

时间:2012-09-12 13:16:14

标签: python machine-learning nltk classification

这是我关于stackoverflow的第一个问题,请耐心等待。

我正在做一些语料库建设,特别是试图撰写高棉语/英语平行语句库。我正在使用一些手动配对的句子来训练最大熵分类器,它将从我的并行文档语料库中选择更多的并行句子对。

我的问题是,我用很少的人工注释训练数据来训练分类器。因此,它不是一个很好的分类器。因此,我的老师建议我查看MaxEnt分类器的原始分数,看看是否有一些分数阈值,高于该分数阈值,人类判断发现分类为翻译的句子对实际上是彼此的翻译。

但是,我使用的是NLTK的MaxEnt分类器,我找不到能给出分类器判断是或否的原始分数的函数。

NLTK的MaxEnt分类器是否具有此功能,或者无法找到分类器原始分数?是否有一个包含更好的MaxEnt分类器的包,它将为您提供我应该使用的原始分数?

提前感谢您的帮助和建议!!

2 个答案:

答案 0 :(得分:4)

prob_classify给出了概率分数。

如果您正在寻找替代MaxEnt分类器,那么scikit-learn有两个实现(one based on liblinearone using SGD training),两者都可以包装在NLTK中{{3} }。 scikit-learn调用MaxEnt逻辑回归,这是NLP社区之外更常见的术语。

(我可能有偏见,因为我是一名scikit-learn撰稿人,我写了SklearnClassifier,但SciPy人员现在也建议使用scikit-learn而不是他们自己弃用的scipy.maxentropy包。 MaxentClassifier所基于的。)

答案 1 :(得分:0)

您可能有兴趣阅读我最近的博客:

http://mattshomepage.com/#/blog/feb2013/liftingthehood

这是关于理解nltk.ne_chunk函数的工作原理。但是这里有一些我写的代码可以快速复制和粘贴,你可能会觉得有用:

import nltk

# Loads the serialized NEChunkParser object
chunker = nltk.data.load('chunkers/maxent_ne_chunker/english_ace_multiclass.pickle')

# The MaxEnt classifier
maxEnt = chunker._tagger.classifier()

def ne_report(sentence, report_all=False):

    # Convert the sentence into a tokens with their POS tags
    tokens = nltk.word_tokenize(sentence)
    tokens = nltk.pos_tag(tokens)

    tags = []
    for i in range(0, len(tokens)):
        featureset = chunker._tagger.feature_detector(tokens, i, tags)
        tag = chunker._tagger.choose_tag(tokens, i, tags)
        if tag != 'O' or report_all:
            print '\nExplanation on the why the word \'' + tokens[i][0] + '\' was tagged:'
            featureset = chunker._tagger.feature_detector(tokens, i, tags)
            maxEnt.explain(featureset)
        tags.append(tag) 

report_all标志可让您查看每个单词的选择方式,但您可能只对选择命名实体的方式感兴趣 - 默认设置为False。

只需传递您喜欢的任何句子,例如“我喜欢Apple产品”。并且它将报告对MaxEnt分类器选择该命名实体的原因的解释。它还将报告可能已被挑选的其他标记的一些概率。

他们的NLTK开发人员提供了一个.explain()方法,这正是这个函数所使用的。