JAVASCRIPT ML
Реализация пакета слов в Javascript
Концепции машинного обучения для разработчиков JavaScript
Недавно я запачкал руки машинным обучением и наткнулся на несколько прекрасных идей в области обработки естественного языка.
Такой как
- Мешок слов
- АОИ
- 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