我们正在尝试使用vowpal-wabbit的Learning2Search获取NER 我们正在使用ATIS数据集。
在ATIS中有127个实体(包括其他类别) 训练集有4978,测试有893个句子。
当我们在测试集上运行它时,它会映射所有类别1(航空公司名称)或2级(机场代码) 这是有线的。
我们尝试了另一个数据集(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)])
要查看完整代码,请参阅此笔记本: https://github.com/nsanthanam/ner/blob/master/vowpal_wabbit_atis.ipynb
答案 0 :(得分: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在这么多标签上效果不好。我可能错了,请告诉我你的结果:)。