2016-12-05 8 views
2

私はPythonのNLTKを使用して、ある種の回答タイプの分類をしようとしています。本質的には、質問の束にそれを訓練し、次にいくつかの目に見えない質問をする。Naive Bayesian Classification(NLTKを使用)

私が気付いている問題は、最も一般的な回答タイプのいずれかをどのような質問にも分類することです。したがって、200人の質問が「人」とマークされ、150人が「場所」としてマークされている場合、すべてのテスト問題に回答タイプ「人」があるとマークされます。

バランスの取れたデータが優れていることは知っていますが、使用しているテストデータの量があれば、非常に厳しい制限のように感じられます。私が使用しているトレーニングデータは、ここでは5500個の質問のセットです:

http://cogcomp.cs.illinois.edu/Data/QA/QC/train_5500.label

そして、これは私のPythonコードです:

import nltk 

train = [] 

with open('data.txt') as f: 
    content = f.readlines() 

for c in content: 
    parts = c.split(' ', 1) 
    train.append((dict(q=parts[1].rstrip()), parts[0])) 


test = [ 
    (dict(q='When was the congress of Vienna?')), 
    (dict(q='What is the capital of Australia?')), 
    (dict(q='Why doesn\'t this classifier work?')) 

] 

classifier = nltk.classify.NaiveBayesClassifier.train(train) 

print classifier.classify_many(test) 

それはテストの質問「HUMのすべての3を割り当てます。 ind 'クラスであり、トレーニングセットの中で最も一般的な質問です。私がこれらのHUM:ind質問の数を減らすと、それは次にそれが次の最も人気があると言うことに始まります。答えのタイプが他のすべてのものを圧倒する前に、矛盾の質問が2つしかない。

何か不足していますか?アルゴリズムを正しく使用していませんか?私のトレーニングデータのフォーマットが変わった場合、いくつかのパラメータがありますか?私の例は、私がオンラインで見たいくつかの例にかなり似ています。何か助けていただきありがとうございます

+0

こちらは#homeworkですか? – alvas

+0

nah、それは仕事のためです – Jayce444

+1

私は 'nltk'をスキップし、' sklearn'に直接行くことを提案します。 – alvas

答えて

1

あなたが分類器に役立つ便利な機能を与えていないので、常に最も頻繁にカテゴリを取得します。証拠がないと推測する必要がある場合、最も一般的なクラスが正しい答えです。

クラシファイアは、以前に見たフィーチャ名とフィーチャ値についてのみ推論できます。 (新しいデータは、以前は見たことがないの組み合わせの既知の機能で構成されています)。しかし、あなたのコードでは1つの「フィーチャ」、qしか定義されておらず、それぞれの場合の値は質問のテキスト全体です。したがって、すべてのテスト問題は、未知の(したがって区別できない)特性値です。あなたは何のために何かを得ることはできません。

Learn how to train a classifier(どのように分類しているのか分かります)、問題は解決します。

+0

オハイオ州、私は十分に公正な参照してください。しかし、答えタイプの分類のために何をすべきですか?私は1つの機能しか持っていません。 – Jayce444

+0

Nnvm、それを理解しました。助けてくれてありがとう – Jayce444

関連する問題