Я играю с BrainJS и выглядит потрясающе! Тем не менее, я только что столкнулся с проблемой: как мне обучить свою нейронную сеть, чтобы узнать общее представление о том, как выглядит номер телефона (я полагаю, вводя в длинный список телефонных номеров?) И после этого, как я на самом деле запустить BrainJS пройти текст и найти номер телефона в нем?
Если мне удастся сделать это, я думаю, что смогу научить NN учиться находить другую значимую информацию, и все это без использования Regex!
Я проверил все доступные функции и не могу найти то, что мне нужно: найти часть конкретных данных из входных данных, основанную на том, с чем нейронная сеть была обучена.
Здесь фрагмент кода, который, как мне кажется, может быть близок к тому, что мне нужно, он понимает, что в предложении есть номер (а) телефона, основанный на обучении. Чего я хочу добиться, так это получить номер телефона на выходе, возможно, на фрагменте текста, который он никогда раньше не видел.
var brain = require('brainjs');
const learnPhoneData = [
{
input: "Our phone number is 06545 294064 or 29495 195869",
output: {phone_number: 1}
},
{
input: "Our direct line is 36496 496743",
output: {phone_number: 1}
},
{
input: "Give us a call on our 02453 753425.",
output: {phone_number: 1}
}
// ... more of the above
]
const nonPhoneData = [
{
input: "Opening hours Monday to Friday - 9:00am to 5.00pm.",
output: {non_phone_number: 1}
},
{
input: "If you need help with your TV or radio broadcast licence please contact email@site.co.uk.",
output: {non_phone_number: 1}
},
{
input: "Welcome to our website!",
output: {non_phone_number: 1}
}
// ... more of the above
]
// of course the larger the datasets, the more accurate the AI.
var maxLengthInput = -1;
const normalizeArray = arr => {
while (arr.length < maxLengthInput) {
arr.push(0);
}
return arr;
}
const fixLengths = (data) => {
for (let i = 0; i < data.length; i++) {
if (data[i].input.length > maxLengthInput) {
maxLengthInput = data[i].input.length;
}
}
for (let i = 0; i < data.length; i++) {
data[i].input = normalizeArray(data[i].input);
}
return data;
}
const encode = d => {
const newArr = [];
d.split('').map(c => {
newArr.push((c.charCodeAt(0) / 255))
})
return newArr
}
const encodeData = data => {
return data.map( d => {
return {
input: encode(d.input),
output: d.output
}
})
}
const serializeAll = data => fixLengths(encodeData(data))
const serializeOne = data => normalizeArray(encode(data));
const trainData = [
...learnPhoneData,
...nonPhoneData
];
const net = new brain.NeuralNetwork({
activation: 'sigmoid', // activation function
hiddenLayers: [100, 100],
iterations: 2000,
learningRate: 0.002, // global learning rate, useful when training using streams
errorThresh: 0.005
});
net.train(serializeAll(trainData), {log: true})
//net.train(serializeAll(trainData))
// if entering only a phone number, it actually is very accurate :)
var output = net.run(serializeOne('07353 456357'))
console.log(output);
// {phone_number: 0.8490427059461814, non_phone_number: 0.149902567401934}
// when entering text and phone number, it is not accurate :-S
output = net.run(serializeOne('Call me on my 07353 456357 and I will get back ASAP.'))
console.log(output);
// {phone_number: 0.41922502546759033, non_phone_number: 0.5814407195666387}