Отображение слов в числа относительно определения - PullRequest
3 голосов
/ 22 марта 2010

В рамках более крупного проекта мне нужно читать по тексту и представлять каждое слово в виде числа.Например, если программа читает « Каждый хороший мальчик заслуживает фруктов », то я получу таблицу, которая преобразует ' каждые ' в '1742 ',' хорошо 'до' 977513 'и т. Д.

Теперь, очевидно, я могу просто использовать алгоритм хешированиячтобы получить эти цифры.Однако было бы более полезно, если бы слова со схожим значением имели числовые значения, близкие друг к другу, так что ' good ' становится ' 6827 ' и ' отлично 'становится' 6835 'и т. Д.

В качестве другого варианта, вместо простого целого числа, представляющего каждое число, было бы еще лучшеиметь вектор, состоящий из нескольких чисел, например ( lexical_category , tense , классификация , specific_word ), где lexical_category - существительное / глагол / прилагательное / и т. Д., время - будущее / прошлое / настоящее, классификация определяет широкий набор общих тем, а specific_word - этокак описано в предыдущем параграфе.

Существует ли такой алгоритм?Если нет, можете ли вы дать мне какие-нибудь советы о том, как начать разрабатывать его самостоятельно?Я кодирую на C ++.

Ответы [ 4 ]

1 голос
/ 22 марта 2010

Чтобы отобразить слово на число, вам, вероятно, следует просто использовать index . Использование хеш-кодов просто напрашивается на неприятности, поскольку совершенно не связанные слова могут в конечном итоге использовать одно и то же значение.

Существует несколько способов получить числовую меру того, насколько семантически связанные слова, например, скрытый семантический анализ (LSA) или использование некоторой меры связанности в лексическом ресурсе, например WordNet (например, Лин , Ресник или Цзян-Конрат ).

Чтобы получить то, что вы называете лексическими категориями, вам понадобится тегер части речи (POS) . POS-теги также дадут вам информацию о времени (например, VBP означает, что слово является глаголом прошедшего времени).

Чтобы назначить слова темам, вы можете использовать гиперную информацию из WordNet. Это даст вам такие вещи, как «красный» - это «цвет». Или вы можете использовать Латентное распределение Дирихле (LDA) , если вы хотите более мягкое назначение слов темам, чтобы каждое слово могло быть назначено различным темам в различной степени.

1 голос
/ 22 марта 2010

Ваша идея интересна, если только немного наивна (но не беспокойтесь, наивные вопросы полезны в области НЛП).

Оставляя в стороне другие практические вопросы (например, парсинг, POS-тегирование, прохождение и, конечно, саму проблему идентификации / отображения данного слова ... Я их очень кратко обсуждаю после этого), есть несколько трудности с самим принципом вашего предложения [числовой шкалы, где семантически близкие слова кодируются в непосредственной близости]:

  • Polysemy (причудливое слово, обозначающее тот факт, что некоторые слова могут иметь множественное, несвязанное значение)
  • Семантика многомерна. Например, существительное «gumption» передает как идею «энергии», так и идею «энтузиазма»
  • Некоторые понятия совершенно не связаны с другими, например, говорят, что «чай» и «ковер» принадлежат двум разным наборам слов, но попытка поместить их в линейный масштаб неявно лишает идеи, что расстояние в этом масштабе (другое чем, может быть, очень маленькие расстояния) имеют какое-либо отношение к семантике.
  • Выражения: внутри предложения определенное понятие иногда переносится выражением, а не отдельными словами. Например, «Человек Ренессанса» или «Содержание».
  • Семантика иногда (часто) происходит из контекста. Например, «босс» часто ссылается на чьего-либо руководителя, это также прозвище Брюса Спрингстина.

В двух словах
а) значение (или « определение », как его называют в вопросе, или « семантика », как его называют лингвисты) - хитрая вещь, которая не поддается отображению на линия или даже дерево. Можно использовать и другие графы, такие как сети, но даже тогда все может стать немного сложнее, если применить его за пределами относительно ограниченных областей.
и
б) ассоциировать слова со значениями также сложно из-за многозначности, выражений и т. д.

Тем не менее, если вы хотите попробовать тип отображения, предложенный в вопросе, возможно, в контексте определенной области (скажем, спортивного комментария или ремонта механики) и / или понимания того, что некоторые слова просто должны быть произвольно нанесены на карту, перед «погружением» вы можете ознакомиться со следующими дисциплинами и ресурсами НЛП (обработка естественного языка) :

Что касается вашего интереса к использованию инструментов, написанных на C ++ , вы, вероятно, найдете несколько из них для различных целей (и различного качества!). Вы также можете обнаружить, что, хотя они иногда связываются с примитивами, написанными на C / C ++ по соображениям производительности, многие современные фреймворки и инструменты NLP, как правило, используют Java или даже языки сценариев, такие как Python. У меня нет прямого опыта работы с программным обеспечением НЛП на C ++. Если вы не можете найти то, что вам нужно (в C ++), я настоятельно рекомендую вам попытаться реализовать что-то самостоятельно, по крайней мере, до того, как вы ранее подробно рассмотрели предыдущее искусство и хорошо разбираетесь в основных трудностях.

0 голосов
/ 26 мая 2010

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

Для слов, как указал dmcer, LSA / PLSA / LDA будет вашим лучшим выбором, если вы действительно хотите сопоставить слова с числами. В этом случае вы получите реальные числа, а не целые числа. Существует большой объем работ по моделям тем и о том, как семантически связанные слова могут быть сгруппированы по одной теме (тематические модели - не что иное, как вероятностная кластеризация слов). Примечательно, что представление LSA использовалось в прошлом для моделирования семантической памяти (пожалуйста, для справки google-scholar "Lemaire and Denhiere") Однако, как указал mjv, домен должен быть ограничен / специализирован, чтобы вы могли убедиться, что размер проблемы не выйдет из-под контроля.

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

1> Теория представлений 2> Универсальный сетевой язык (язык как гиперграф слов, где предложения являются гиперчленами) 3> Колмогоровская сложность и репрезентативное искажение 4> Теория групп и теория графов (есть много интересных представлений, которые могут быть использованы) 5> Обзор теории чисел (чтобы увидеть, могут ли определенные категории чисел быть связаны с определенными категориями слов)

Тезис Ризи Кондор тоже интересен.

0 голосов
/ 22 марта 2010

Обработка естественного языка - это обширное и сложное поле. Существуют некоторые инструменты (см. Раздел «Программные инструменты» в связанной статье), причем преобладающим является NLTK.

Я не знаю простого ответа, но это место для начала.

...