Как использовать машинное обучение для подсчета слов в тексте - PullRequest
0 голосов
/ 02 марта 2020

Вопрос: задан фрагмент текста типа «Это тест»; как построить модель машинного обучения, чтобы получить количество вхождений слов, например, в этом фрагменте, количество слов равно 4. После обучения можно прогнозировать количество слов в тексте.

Я знаю, что это легко написать программа (как псевдокод ниже),

data: memory.punctuation['~', '`', '!', '@', '#', '$', '%', '^', '&', '*', ...]
f: count.word(text) -> count =
   f: tokenize(text) --list-->
   f: count.token(list, filter) where filter(token)<not in memory.punctuation> -> count

, однако в этом вопросе нам потребуется использовать алгоритм машинного обучения. Интересно, как машина может изучить концепцию count (в настоящее время мы знаем, что машинное обучение хорошо в classification). Есть идеи и предложения? Заранее спасибо.


Сбои:

Мы можем использовать sth как word2ve c (кодировщик) для построения векторов слов; если мы рассмотрим подход seq2seq, мы можем тренировать что-то вроде This is a test <s> 4 <e> This is very very long sentence and the word count is greater than ten <s> 4 1 <e> (4 1 для представления числа 14). Однако это не работает, поскольку модель внимания используется для получения аналогичного вектора, например для перевода текста (This is a test --> 这(this) 是(is) 一个(a) 测试(test)). Трудно найти связь между [this ...] и 4, которая представляет собой агрегированное число (то есть модель не сходится).

Мы знаем, что машинное обучение хорошо классифицирует. Если мы рассматриваем «4» как класс, количество классов бесконечно; если мы делаем хитрость и используем count/text.length в качестве прогноза, у меня нет модели, которая бы подходила даже для набора обучающих данных (модель не сходится); например, если мы используем много коротких предложений для обучения модели, она не сможет предсказать длину длинного предложения. И это может быть связано с информационным парадоксом: we can encode data in a book as 0.x and use a machine to to mark a position on a rod to split it into 2 parts with length a and b, where a/b = 0.x; but we cannot find a machine.

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

Я думаю, что мы можем принять это как проблему классификации для символа, являющегося вводом, и if word breaker в качестве вывода.

Другими словами, в некоторый момент времени t мы Выведите, является ли входной символ в тот же момент времени символом разбиения по словам (YES) или нет (NO). Если да, то увеличьте количество слов. Если нет, тогда читайте следующий символ.

На современном английском языке sh я не думаю, что будут длинные слова. Такая простая модель RNN должна обойтись, возможно, без заботы об исчезающем градиенте.

Дайте мне знать, что вы думаете!

0 голосов
/ 16 апреля 2020

Используйте NLTK для подсчета слов,

from nltk.tokenize import word_tokenize text = "God is Great!" word_count = len(word_tokenize(text)) print(word_count)

0 голосов
/ 02 марта 2020

А как насчет проблемы регрессии?

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

Также вы можете обучить простую RNN выполнять эту работу, предполагая, что вы используете горячую кодировку и получаете вывод из последнего состояния.
Если V_h - это все нули, но индекс пробела ( что также будет 1) и V_x, тогда сеть фактически суммирует пробелы, и если c равно 1 в конце, то в результате будет количество слов - для каждой длины!

...