2017-04-05 24 views
2

私たちはvowpal-wabbitのLearning2SearchをNER に使用しようとしています。私たちはATISデータセットを使用しています。NER用のLearning2Search(vowpal-wabbit)は、奇妙な結果をもたらします。

ATISには、127個のエンティティ(その他のカテゴリを含む)があります。 トレーニングセットは4978、テストには893文があります。

テストセットでどのように実行すると、クラス1(航空会社名)またはクラス2(空港コード)のすべてがマッピングされます 有線です。

enter image description here

私たちは、同じ動作を別のデータセット(https://github.com/glample/tagger/tree/master/dataset)を試してみました。

私は正しい方法で使用していないようです。どのポインタも大きな助けになるでしょう。

コードスニペット:

with open("/tweetsdb/ner/datasets/atis.pkl") as f: 
    train, test, dicts = cPickle.load(f) 

idx2words = {v: k for k, v in dicts['words2idx'].iteritems()} 
idx2labels = {v: k for k, v in dicts['labels2idx'].iteritems()} 
idx2tables = {v: k for k, v in dicts['tables2idx'].iteritems()} 


#Convert the dataset into a format compatible with Vowpal Wabbit 
training_set = [] 
for i in xrange(len(train[0])): 
    zip_label_ent_idx = zip(train[2][i], train[0][i]) 
    label_ent_actual = [(int(i[0]), idx2words[i[1]]) for i in zip_label_ent_idx] 
    training_set.append(label_ent_actual) 


# Do like wise to get test chunk 

class SequenceLabeler(pyvw.SearchTask): 
    def __init__(self, vw, sch, num_actions): 
     pyvw.SearchTask.__init__(self, vw, sch, num_actions) 

     sch.set_options(sch.AUTO_HAMMING_LOSS | sch.AUTO_CONDITION_FEATURES) 

    def _run(self, sentence): 
     output = [] 
     for n in range(len(sentence)): 
      pos,word = sentence[n] 

      with self.vw.example({'w': [word]}) as ex: 
       pred = self.sch.predict(examples=ex, my_tag=n+1, oracle=pos, condition=[(n,'p'), (n-1, 'q')]) 
       output.append(pred) 
     return output 

vw = pyvw.vw("--search 3 --search_task hook --ring_size 1024") 

コードをモデルに訓練するため:予測のため

#Training 
sequenceLabeler = vw.init_search_task(SequenceLabeler) 
for i in xrange(3): 
    sequenceLabeler.learn(training_set[:10]) 

コード:

pred = [] 
for i in random.sample(xrange(len(test_set)), 10): 
    test_example = [ (999, word[1]) for word in test_set[i] ] 
    test_labels = [ label[0] for label in test_set[i] ] 
    print 'input sentence:', ' '.join([word[1] for word in test_set[i]]) 
    print 'actual labels:', ' '.join([str(label) for label in test_labels]) 
    print 'predicted labels:', ' '.join([str(pred) for pred in sequenceLabeler.predict(test_example)]) 

を完全なコードを表示するには、plsはこのノートを参照してください。 https://github.com/nsanthanam/ner/blob/master/vowpal_wabbit_atis.ipynb

答えて

1

私はこのアルゴリズムを初めて使っていますが、最近パイロット研究を行っています。あなたの問題へ

、答えはあなたが

ここ
vw = pyvw.vw("--search 3 --search_task hook --ring_size 1024") 

に間違ったパラメータを設定することで、検索は「127」と設定する必要があり、かつこのように、VWはあなたの127個のタグを使用します。

vw = pyvw.vw("--search 127 --search_task hook --ring_size 1024") 

また、私の気持ちは、vwが非常に多くのタグでうまく動作しないということです。私は間違っているかもしれません、あなたの結果を教えてください:)