-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathevaluation.js
More file actions
89 lines (69 loc) · 2.37 KB
/
Copy pathevaluation.js
File metadata and controls
89 lines (69 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
const _ = require('lodash');
const fs = require('fs');
const path = require('path');
const async = require('async');
const crfsuite = require('vntk/lib/crfsuite');
const conlleval = require('@vntk/conlleval');
const iobParser = require('./lib/iob');
const featEx = require('./lib/features');
let template = [
'T[-2].lower', 'T[-1].lower', 'T[0].lower', 'T[1].lower', 'T[2].lower',
'T[0].istitle', 'T[-1].istitle', 'T[1].istitle', 'T[-2].istitle', 'T[2].istitle',
//# word unigram and bigram
'T[-2]', 'T[-1]', 'T[0]', 'T[1]', 'T[2]',
'T[-2,-1]', 'T[-1,0]', 'T[0,1]', 'T[1,2]',
//# pos unigram and bigram
'T[-2][1]', 'T[-1][1]', 'T[0][1]', 'T[1][1]', 'T[2][1]',
'T[-2,-1][1]', 'T[-1,0][1]', 'T[0,1][1]', 'T[1,2][1]',
//# ner
'T[-3][3]', 'T[-2][3]', 'T[-1][3]',
];
const tagger = new crfsuite.Tagger();
let test_sents = iobParser.fromFile('./dataset/vlsp2016/test.txt');
let model_filename = path.resolve('./models/model.bin');
if (!fs.existsSync(model_filename)) {
console.error('Firstly please run: npm run train');
return process.exit(1);
}
if (tagger.open(model_filename)) {
console.log('open file model ok!', model_filename);
}
function transform(tokens) {
return tokens.map((token, i) => featEx.word2features(tokens, i, template));
}
const diff = [];
test_sents.forEach((sent, index) => {
console.log('Predict, sent at: ', index);
let X_test = transform(sent);
let output = tagger.tag(X_test);
let tokens = sent.map((token, i) => {
return [
token[0], // term
token[3], // y_correct
output[i] // y_guessed
]
});
diff.push(tokens);
});
// run conlleval
// let tokens = _.flatten(diff);
let fn = './models/diff.txt';
let writeFile = new Promise((resolve, reject) => {
let stream = fs.createWriteStream(fn);
console.log('Write different.txt');
async.each(diff, (sent, cb1) => {
async.each(sent, (token, cb2) => {
let data = `${token.join('\t')}\n`;
stream.write(data, 'utf8', cb2);
}, cb1);
}, (err) => {
stream.end();
});
stream.on('finish', resolve);
stream.on('error', reject);
});
writeFile.then(() => {
let metrics = conlleval.measure_performance(fn, '\t');
fs.writeFileSync('./models/metrics.json', JSON.stringify(metrics, null, 2));
console.log('Evaluation done!');
});