Как использовать brainjs для поиска телефонных номеров в тексте - без регулярных выражений - PullRequest
1 голос
/ 30 апреля 2019

Я играю с 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}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...