обработка строк текста для ввода нейронной сети

Я понимаю, что ввод ИНС должен быть нормализован, стандартизирован и т. Д. Не говоря уже об особенностях и моделях различных ИНС, как я могу предварительно обработать текст в кодировке UTF-8 в диапазоне {0,1} или, альтернативно, в диапазоне {-1, 1}, прежде чем он будет передан в нейронные сети? Я искал это в Google, но не могу найти никакой информации (возможно, я использую неправильный термин).

  1. Имеет ли это смысл?
  2. Разве не так препроцессируют текст для нейронных сетей?
  3. Есть ли альтернативы?

Обновление от ноября 2013 г.

Я давно считаю правильным ответ Пита. Однако у меня есть серьезные сомнения, в основном из-за недавних исследований, которые я проводил в области символических знаний и ИНС.

Дарио Флореано и Клаудио Маттиусси в своей книге объясняют, что такая обработка действительно возможна, с помощью распределенного кодирования.

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

Теуво Кохонен в своей статье Самоорганизующиеся карты объясняет:

Можно подумать, что применение законов нейронной адаптации к набору символов (рассматриваемому как набор векторных переменных) может создать топографическую карту, которая отображает логические расстояния между символами. Однако возникает проблема, заключающаяся в другом характере символов по сравнению с непрерывными данными. Для последних сходство всегда проявляется естественным образом в виде метрических различий между их непрерывными кодировками. Это больше не верно для дискретных символических элементов, таких как слова, для которых не определена метрика. По самой природе символа его значение отделено от его кодировки.

Однако Кохонену удалось справиться с символической информацией в SOM!

Кроме того, профессор д-р Альфред Ульч в своей статье Интеграция нейронных сетей с обработкой символических знаний конкретно касается того, как обрабатывать символические знания (например, текст) в ИНС. Ultsch предлагает следующие методологии обработки символических знаний: нейронное приближенное рассуждение, нейронное объединение, самоанализ и интегрированное получение знаний. Хотя мало информации можно найти о тех, в Google Scholar или где-либо еще по этому вопросу.

Пит в своем ответе прав насчет семантики. Семантика в ИНС обычно отключена. Однако следующая ссылка дает представление о том, как исследователи использовали RBM, обученные распознавать сходство в семантике различных входных слов, поэтому не должно быть невозможным иметь семантику, но для этого потребуется многоуровневый подход или вторичная ИНС, если требуется семантика. .

Обработка естественного языка с помощью субсимволических нейронных сетей, Ристо Мииккулайнен, 1997 г. Обучение ограниченных машин Больцмана на наблюдениях за словами, Г.Э.Даль, Райан П. Адамс, Х. Рарошель, 2012 < / а>

Обновление от января 2021 г.

В области НЛП и глубокого обучения наблюдается возрождение исследований в последние несколько лет, и с тех пор, как я задал этот вопрос. Сейчас существуют модели машинного обучения, которые решают то, что я пытался достичь разными способами.

Для всех, кто задается этим вопросом и задается вопросом о том, как предварительно обработать текст в глубоком обучении или нейронных сетях, вот несколько полезных тем, ни одна из которых не является академической, но простой для понимания и которая должна помочь вам приступить к решению аналогичных задач:

В то время, когда я задавал этот вопрос, собирались начать использовать RNN, CNN и VSM, в настоящее время большинство фреймворков глубокого обучения поддерживают обширную поддержку NLP. Надеюсь, что это поможет.


person Ælex    schedule 09.02.2013    source источник
comment
Имеет ли это смысл, больше зависит от того, чего вы пытаетесь достичь с помощью своей ИНС. У вас фиксированная длина текста? То есть всегда ли вводимая строка будет одинаковой длины? Если нет, то, вероятно, это не то, чем вы хотите заниматься. Можете ли вы более подробно описать, чего вы пытаетесь достичь с помощью своей ИНС в целом? Какую проблему вы пытаетесь решить.   -  person Pete    schedule 19.02.2013
comment
@Pete Я пытаюсь разобрать строки utf-8 в вектор чисел перед отправкой их в нейронную сеть. Мне не нужно извлечение или сжатие каких-либо функций, а скорее двунаправленное отображение строк в числа с плавающей запятой. Причина этого - часть моего исследования имитационного обучения и сетей глубоких убеждений. Я не могу вдаваться в подробности, не написав много страниц. Моя текущая проблема заключается в том, что я нигде не могу найти никакой информации о том, как безопасно использовать строки текста (не фиксированной длины, но с максимальной длиной) в качестве входных данных для ИНС.   -  person Ælex    schedule 19.02.2013
comment
Думаю, я пытаюсь понять, какую информацию о словах вы хотите получить? Это их смысл? Может быть, вы произнесли 20 слов, и их конкретное значение неважно, какое именно слово связано с вводными словами? Вы понимаете, о чем я прошу? Есть ли фиксированное количество слов, которые могут быть частью вашего ввода? Я не думаю, что вы сможете сделать настоящее двунаправленное отображение, как вы имеете в виду, если только строки не являются вариациями степеней, которые можно упорядочить таким образом, чтобы близость значения с плавающей запятой ассоциировалась с близостью слов.   -  person Pete    schedule 19.02.2013
comment
@Pete Ни то, ни другое, слова должны быть введены без каких-либо изменений. Строки, по сути, являются вводом и должны быть связаны с конкретным выводом. Я ищу способ преобразования строки (строк) в эквивалентное числовое значение, которое может обрабатывать ИНС. Точно так же, как вы отображаете пиксели в представление перед тем, как вводить векторы в качестве входных данных, то же самое. Когда я говорю «двунаправленный», я имею в виду, что после преобразования из строки символов utf-8 в вектор с плавающей запятой должно быть возможно обратное. Я использую для UTF-8 библиотеку ICU (icu :: UnicodeString).   -  person Ælex    schedule 19.02.2013
comment
@Pete до сих пор я думал взять десятичный код для каждого символа UTF-8 и нормализовать его в пределах -1.0 и 1.0. Поскольку UTF-8 может отображать 1111998 возможных комбинаций, я намеревался получить десятичный код для каждого символа, найденного в строке, нормализовать его и, таким образом, преобразовать в вектор с плавающей запятой. Имеет ли это смысл ?   -  person Ælex    schedule 19.02.2013


Ответы (5)


Я продолжу и резюмирую наше обсуждение в качестве ответа здесь.

Ваша цель - включить текст в вашу нейронную сеть. Мы установили, что традиционные ИНС не очень подходят для анализа текста. Основное объяснение того, почему это так, основано на идее, что ИНС оперируют входными данными, которые обычно представляют собой непрерывный диапазон значений, а близость двух значений для входных данных означает некоторую близость по их значению. Слова не имеют представления о близости, поэтому не существует реального числового кодирования слов, которые могут иметь смысл в качестве входных данных в ИНС.

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

person Pete    schedule 21.02.2013
comment
большое спасибо за вашу помощь. Единственная причина, по которой я пока не принимаю это как ответ, заключается в том, что я надеюсь получить больше ответов и вариантов. - person Ælex; 21.02.2013
comment
Что ж, спасибо за награду. Надеюсь, вы найдете хорошее общее решение. - person Pete; 21.02.2013
comment
Я считаю, что существуют также семантические нейронные сети, которые пытаются решить эту проблему. Но это было бы отдельно от любых других входных значений, поскольку кажется, что они работают по-другому. Можно подумать о подаче выходного сигнала байесовского фильтра или чего-то еще, чтобы перевести текст в дискретную переменную. - person Kevin; 10.06.2015

Отвечая на ваши комментарии, нет, предложенная вами схема не совсем понятна. Выход искусственного нейрона по своей природе представляет собой непрерывное или, по крайней мере, двоичное значение. Нет смысла сопоставлять огромное дискретное перечисление (например, символы UTF-8) и непрерывный диапазон, представленный значением с плавающей запятой. ИНС обязательно будет действовать так, как будто 0,1243573 - очень хорошее приближение к 0,1243577, когда эти числа можно легко сопоставить, например, с символом новой строки и символом "а", что не будет хорошим приближением для каждого прочее вообще.

Откровенно говоря, не разумного представления «общей строки Unicode» в качестве входных данных для ИНС. Разумное представление зависит от специфики того, что вы делаете. Это зависит от ваших ответов на следующие вопросы:

  • Ожидаете ли вы, что во входных строках будут отображаться слова, а не блоки символов? Какие слова вы ожидаете увидеть в строках?
  • Каково распределение длины входных строк?
  • Какова ожидаемая энтропия входных строк?
  • Есть ли у вас какие-либо специфические знания о том, как должны выглядеть строки?

и, самое главное

  • Что вы пытаетесь делать с ИНС. Это не, которое можно игнорировать.

Возможно, у вас есть настройка, для которой отсутствует перевод, который фактически позволит вам делать то, что вы хотите, с нейронной сетью. Пока вы не ответите на эти вопросы (вы обойдете их стороной в комментариях выше), невозможно дать хороший ответ.

Я могу дать пример ответа, который сработает, если вы дадите определенные ответы на вышеуказанные вопросы. Например, если вы читаете строки произвольной длины, но состоящие из небольшого словаря слов, разделенных пробелами, я бы предложил схему перевода, в которой вы делаете N входов, по одному для каждого слова в словаре, и используете повторяющийся нейронный сеть, чтобы вводить слова по одному, устанавливая соответствующий вход на 1, а все остальные на 0.

person Jeremy Salwen    schedule 20.02.2013
comment
Спасибо. Я пытался понять, как лучше это объяснить. Вы проделали отличную работу! - person Pete; 20.02.2013
comment
@Pete, как вы думаете, я могу передать текст (независимо от кодировки) в нейронную сеть? Если вы хотите представить в качестве ввода для ИНС строку и ожидать связанного вывода, как вы преобразовываете / отображаете текст для этого? Вы наносите на карту слова вместо символов? Я намерен использовать ANN (конкретнее DBN стеков RBM), где текст предоставляется в качестве ввода и получается связанный вывод. - person Ælex; 20.02.2013
comment
@ Алекс, я думаю, ты не совсем понимаешь объяснение Джереми. В общем, текст не является полезным вводом для стандартной нейронной сети. Я снова спрошу следующее: какую информацию содержит текст, который вам нужен? Какова природа информации, содержащейся в тексте, который вы пытаетесь уловить. Смысл слов? Сочетания букв в словах? Это вопрос, на который действительно нужно ответить, прежде чем кто-либо сможет дать вам какой-либо реальный ответ по этому поводу. - person Pete; 20.02.2013
comment
@Pete Я понял, что он говорит, но должен быть какой-то способ сопоставить, сжать, закодировать или представить слова в качестве входных данных для ИНС. Информация в тексте зависит от предметной области, сам текст является образцом и, следовательно, вводом. Информация представляет собой текст (представление примера), скрытого смысла нет. Однако текст может быть разбит на слова и т. Д. Значение слов такое же, как и у слов, которые вы сейчас читаете, на естественном языке. Комбинации остаются на усмотрение демонстратора. Это не эксперимент с машинным обучением для конкретной предметной области, а универсальный фреймворк. - person Ælex; 20.02.2013
comment
Хорошо, тогда, если значение слов имеет значение, нет реального способа закодировать его в стандартной нейронной сети. Скажем, вы кодируете ввод для масштабирования на основе ASCII. Итак, каждый ввод - это буква. Тогда, согласно вашей сети, DOG и EOG очень похожи, потому что численно они будут очень близки. Но на английском языке DOG - это слово, а EOG - это просто случайная комбинация букв. Нет близости. Входы и выходы непрерывны и имеют понятие близости. Невозможно перевести текст в такого рода рамки. - person Pete; 20.02.2013
comment
Я должен добавить, что нет способа перевести текст в такого рода структуру ... разумным способом. Я имею в виду, что вы могли бы построить смехотворно огромную ИНС с одним двоичным входом для каждой строки меньше определенной длины или чего-то в этом роде ... но вы бы не смогли ничего с этим сделать ... - person Jeremy Salwen; 21.02.2013
comment
@Pete Спасибо, в этом гораздо больше смысла. Итак, должен ли я вместо этого смотреть на кодирование / отображение слов в конкретное входное значение? - person Ælex; 21.02.2013
comment
@JeremySalwen Моя цель - невероятно огромная ИНС с миллионами нейронов, работающих на высокопроизводительных вычислениях, предпочтительно с использованием GPGPU. Подобные статьи, библиография и ссылки используют ИНС с миллионами нейронов для аналогичных целей. Тем не менее, я, кажется, понимаю, что вы предлагаете - избегать посимвольного перекодирования слов и вместо этого перейти на пословную предварительную обработку? - person Ælex; 21.02.2013
comment
Ну, опять же, дело в значении входов и выходов. Если вы кодируете слова как некую ценность, обладают ли сами слова свойством близости? То есть, если вы получите выходное значение, которое соответствует некоторой средней точке между двумя словами (потому что, помните, ваши выходные данные являются непрерывными в диапазоне, а не с некоторыми фиксированными интервалами), будет ли оно по-прежнему иметь значение? Что означает значение, находящееся на полпути между хорошим и желтым? Если значения слов не могут иметь какое-то представление о близости, тогда это не сработает. Что вы можете сделать, так это иметь логические входы, которые представляют существование слова. - person Pete; 21.02.2013
comment
Так, например, вход 4 может обозначать наличие слова желтый. Если слово находится на входе, вы устанавливаете его на 1, в противном случае - на 0. Такой тип настройки, скорее всего, будет иметь значение для входов. - person Pete; 21.02.2013
comment
@Pete Это очень интересный момент. То, что вы предлагаете, по сути является вектором логических входных данных для существования (или несуществования) слова? Я бы предположил, что для этого потребуется ввести количество возможных слов, которые могут существовать? - person Ælex; 21.02.2013
comment
@Alex, да, вам нужно по одному на каждое слово, которое может иметь ценность. Но вы также должны иметь в виду, что это просто существование слов, и их смысл в значительной степени утерян. Например, разница между счастливым и несчастливым довольно существенна, но если сеть просто фиксирует наличие слов «счастливый» и «нет», она может потерять смысл. Итак, он не счастлив и не только счастлив ... будет иметь то же значение для вашей сети, но и очень разные семантические значения. И вы не заставите свою сеть обрабатывать семантическое значение. - person Pete; 21.02.2013
comment
@Pete Это имеет больше смысла. Я видел нечто похожее на первую статью, на которую я ссылался в отредактированном вопросе выше. Предположим, мне действительно нужна работающая семантика (до определенной степени), какие еще варианты у меня были бы? Теперь я понимаю, что посимвольный перевод не имеет смысла и что слова дискретны и не непрерывны. Вы знаете, как с этим справиться? Чтобы ответить на вопросы, которые вы задавали ранее, моя цель - использовать сеть для аппроксимации (подобия) и ассоциации ввода с выводом. Если хотите, не могли бы вы ответить на это своим собственным ответом? - person Ælex; 21.02.2013
comment
@Alex, возможно, вы захотите изучить алгоритмы семантического анализа. Я мало о них знаю, но полагаю, что вы могли бы найти алгоритм, соответствующий вашим конкретным потребностям. Иногда что-то подобное может использоваться для ввода данных в нейронную сеть. То есть он мог бы выполнить анализ, который может дать вам значения, которые затем будут иметь смысл в качестве входных данных в модель нейронной сети. Например, у вас может быть тема и мнение по этой теме. Затем сетевой ввод может быть связан с этой темой, а значение может быть нормализованным настроением. - person Pete; 21.02.2013
comment
@Pete Еще раз спасибо. Вы действительно мне помогли. Если вы хотите ответить тем, что написали до сих пор, и награда ваша :) - person Ælex; 21.02.2013

Я думаю, было бы увлекательно передать текст (закодированный на уровне символов) сети глубоких убеждений, чтобы увидеть, какие свойства языка она может обнаружить.

В последнее время было проделано много работы по моделированию языка нейронных сетей (в основном на уровне слов, но также и на уровне символов).

См. Эти ссылки для получения дополнительной информации

http://www.stanford.edu/group/pdplab/pdphandbook/handbookch8.html http://code.google.com/p/word2vec/

Векторы слов кодируются путем обучения на большом корпусе статей в Википедии и т. Д. И могут приобретать семантические и синтаксические особенности, что позволяет определять «расстояние» между ними »

«Недавно было показано, что векторы слов отражают многие лингвистические закономерности, например, векторные операции вектор ('король') - вектор ('мужчина') + вектор ('женщина') близок к вектору ('королева')»

Также посмотрите эту замечательную исследовательскую работу Ильи Суцкевера о генерации случайных символов, которые демонстрируют особенности английского языка после обучения в Википедии. Потрясающие вещи!

http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdf http://www.cs.toronto.edu/~ilya/rnn.html (онлайн-демонстрация создания текста - очень круто!)

person swami    schedule 13.08.2013
comment
Привет! Спасибо за вклад! Я смотрел на самоорганизующиеся карты, поскольку Кохонен в своей оригинальной статье рассматривал вопрос о том, что символическая информация обрабатывается ИНС. Первая ссылка, которую вы предоставили, похоже, использует рекуррентные нейронные сети, поэтому я не могу не думать, что, возможно, рекуррентная машина Больцмана может иметь дело с текстовым вводом. Спасибо за остальные ссылки, особенно за вторую, так как я вижу, что скоро буду ею пользоваться. С уважением, Алекс. - person Ælex; 16.08.2013

Не совсем понятно, что вы пытаетесь сделать, но я предполагаю, что это в некотором смысле связано с тем, что люди называют «естественным языком». Об этом много отсылок ... Я не эксперт, но знаю, например, что есть интересные отсылки от О'Рейли.

С точки зрения NN существует множество различных моделей NN. Я думаю, вы имеете в виду самый популярный из них, известный как многослойный перцептрон с своего рода алгоритмом обратного распространения ошибки, но существует множество моделей ассоциативной памяти, которые могут быть более подходящими для вашего случая. Очень хорошее упоминание об этом - книга Саймона Хайкина.

Однако, если бы я попытался сделать что-то подобное, я бы начал пытаться понять, как частота букв, слогов и слов возникает вместе в английском языке (?).

Надеюсь, что помог. Как я уже говорил, я не специалист в этой области.

person DanielTheRocketMan    schedule 20.02.2013
comment
Спасибо, да, это связано с обработкой естественного языка, поскольку ввод осуществляется на естественном языке, хотя на самом деле речь идет о извлечении информации (или знаний) из естественного языка и связывании ее с решением. Почему вы упоминаете частоту букв и слогов (вы не первый, кто мне это говорит)? - person Ælex; 21.02.2013
comment
Я не уверен, что вы пытаетесь сделать, но мне грустно, что ... На каждом языке буквы появляются с разной частотой. См., Например, en.wikipedia.org/wiki/Letter_frequency ... Если отсутствует буква в вашем слове, и у вас нет другой информации, вы можете просто использовать частоту букв в английском языке. Если у вас есть слог, у вас есть дополнительная информация. Слоги также возникают с разной частотой ... Если вы говорите о полных предложениях, вы знаете, что разные слова имеют разные функции и снова возникают с разной частотой ... - person DanielTheRocketMan; 21.02.2013

Решение 1. A = Alt (65) = 65 Bin = 01000001

Решение 2. Добавьте слова в базу словаря и добавьте поле id (int). Преобразование поля id в двоичное.

В NN используйте буквы или идентификаторы слов (в двоичном формате)

person user3557421    schedule 16.08.2017