2

这是我关于stackoverflow的第一个问题,请多多包涵。

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

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

但是,我正在使用 NLTK 的 MaxEnt 分类器,但我找不到一个函数可以为我提供分类器用来决定是或否的原始分数。

NLTK 的 MaxEnt 分类器有这个功能,还是没有办法找出分类器的原始分数?是否有一个具有更好 MaxEnt 分类器的软件包,可以为您提供我应该使用的原始分数?

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

4

2 回答 2

4

prob_classify给出概率分数。

如果您正在寻找替代的 MaxEnt 分类器,那么 scikit-learn 有两种实现方式(一种基于 liblinear一种使用 SGD training),两者都可以包装在 NLTKSklearnClassifier中。scikit-learn 调用 MaxEnt 逻辑回归,这是 NLP 社区之外更常见的术语。

(我可能有偏见,因为我是 scikit-learn 的贡献者并且我写了 scikit-learn SklearnClassifier,但是 SciPy 的人们现在也推荐 scikit-learn 而不是他们自己的已弃用的scipy.maxentropy包,这MaxentClassifier是基于它的。)

于 2012-09-12T13:26:31.223 回答
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() 方法,而这正是该函数所使用的。

于 2013-02-13T21:53:45.780 回答