JAVASCRIPT ML

Реализация пакета слов в Javascript

Концепции машинного обучения для разработчиков JavaScript

Недавно я запачкал руки машинным обучением и наткнулся на несколько прекрасных идей в области обработки естественного языка.

Такой как

  1. Мешок слов
  2. АОИ
  3. TF-IDF

Поэтому я решил сделать это с помощью простых примеров в javascript, чтобы сделать концепции более понятными для меня.

Итак, давайте начнем с мешка слов

скажем, у нас есть обзоры продуктов, например

const reviews = [
  {text:"this product is amazing",score:1},
  {text:"this product is great",score:1},
  {text:"this product is horrible",score:0},
  {text:"this product is bad",score:0},
];

Теперь в каждом обзоре есть две вещи: текст и оценка, независимо от того, положительная она или отрицательная.

поэтому теоретически мы можем видеть, что в положительном отзыве есть такие слова, как «удивительно здорово», а в отрицательном — такие слова, как «ужасно плохо».

так что теперь мы можем сказать с помощью этих выборочных данных, что если в обзоре есть такие слова, как потрясающий или отличный, мы можем классифицировать его как положительный (1) или отрицательный (0), если в нем есть такие слова, как ужасный или плохой

так что это в теории, и мы понимаем это как человека, но система (алгоритмы мл) на данный момент понимает только числа или векторы, поэтому нам нужно каким-то образом преобразовать текст нашего обзора в числовые данные.

мешок слов — это очень простое представление, используемое для представления текста как набора его собственных слов.

поэтому сначала нам нужно преобразовать предложение в слова, а затем получить все уникальные слова

["this ,product ,is ,amazing"]
["this ,product ,is ,great"]
["this ,product ,is ,horrible"]
["this ,product ,is ,bad"]

теперь следующий шаг - просто подсчитать, сколько раз слово появлялось в предложении как

{
'this',
'product',
'is',
'amazing',
'great',
'horrible',
'bad'}

Теперь для каждого предложения мы посчитаем, сколько раз слово появилось в предложении.

for example
for "this" word we will get 
{ [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ]}
it says for the first row "this" keyword is only used once [0,1]
for the second row "this" keyword is only used once [1,1]
for the third row "this" keyword is only used once [2,1]
for the fourth row "this" keyword is only used once [3,1]

таким же образом мы получим данные для всех строк

this => { [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ] }
product => { [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ] }
is => { [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ] }
amazing => { [ 0, 1 ] }
great => { [ 1, 1 ] }
horrible => { [ 2, 1 ] }
bad => { [ 3, 1 ] }

давайте посмотрим на код, чтобы получить эти результаты в javascript

поэтому у нас будет две основные функции, которые все люди, работающие с ML, могли видеть в python или sklearn, выучить FIT и TRANSFORM.

const reviews = [
  {text:"this product is amazing",score:1},
  {text:"this product is great",score:1},
  {text:"this product is horrible",score:0},
  {text:"this product is bad",score:0},
];
const fit = (corpus) => {
 const uniqueWords = new Set();
 corpus.forEach((document, index) => {
   document.split(" ").forEach((word) => {
    uniqueWords.add(word);
  });
 });
 return uniqueWords;
};
const transform = (corpus, uniqueWords) => {
  const wordCounts = new Map();
  corpus.forEach((document, index) => {
    document.split(" ").forEach((word) => {
      if (!wordCounts.has(word)) {
       wordCounts.set(word, new Map());
      }
    const wordMap = wordCounts.get(word);
    if (!wordMap.has(index)) {
      wordMap.set(index, 0);
    }
    wordMap.set(index, wordMap.get(index) + 1);
    });
  });
  return wordCounts;
};

Теперь, чтобы запустить эти функции, мы будем запускать их как

const uniqueWords = fit(reviews.map(a=>a.text));
const wordCounts = transform(reviews.map(a=>a.text), uniqueWords);
wordCounts.forEach((key,value,map)=>{
  console.log(value,key.entries());
})

и выход будет следующим

this [Map Entries] { [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ] }
product [Map Entries] { [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ] }
is [Map Entries] { [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ] }
amazing [Map Entries] { [ 0, 1 ] }
great [Map Entries] { [ 1, 1 ] }
horrible [Map Entries] { [ 2, 1 ] }
bad [Map Entries] { [ 3, 1 ] }

Основываясь на отзывах и взаимодействии с этим постом, я напишу больше, объясняя реализацию IDF и TFIDF в простом javascript.

Если я допустил какие-либо ошибки, поправьте меня :)

Спасибо
Подписаться на Javascripttricks.com