Базовый NLP в CoffeeScript или токенизация JavaScript Punkt, простые обученные байесовские модели, с чего начать?

Мой текущий проект веб-приложения требует небольшого НЛП:

  • Токенизация текста в предложения с помощью Punkt и подобных;
  • Разбивка более длинных предложений по придаточным предложениям (часто с запятыми, за исключением случаев, когда их нет)
  • Байесовская модель, подходящая для разделения абзацев на куски с равномерным ощущением, без сирот или вдов и минимальными неудобными разбиениями (возможно)

... что по-детски просто, если у вас есть NLTK — что я и делаю, что-то вроде: серверная часть приложения — Django на Tornado; вы могли бы подумать, что выполнение этих вещей не будет проблемой.

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

Прямо сейчас я фактически использую NLTK через вызов REST API к процессу Tornado, который обертывает функцию NLTK, и немного больше. На данный момент такие вещи, как задержка и параллелизм, явно неоптимальны с этой специальной службой, мягко говоря. Что я должен сделать, я думаю, так это получить в свои руки версии этой функции для Coffee/Java, если не реализовать ее самостоятельно.

И, тем не менее, из того, что я видел, JavaScript не считался крутым достаточно долго, чтобы накопить не только веб-специфическую, универсальную библиотеку schmorgasbörd, которую можно найти в C или Python (или даже Erlang). NLTK, конечно, является выдающимся проектом по всем меркам, но мне нужно только несколько процентов того, что он упаковывает.

Но теперь я на распутье — я должен удвоить ставку:

  • План «Изучение научной техники JavaScript, пригодной для повторной реализации алгоритмов, с которыми я в лучшем случае дружу на Facebook», или:
  • Менее интересные, но более детерминистически выполнимые «соглашаются на токенизацию по сети, но компенсируют нехватку скорости и интересности программирования — обеспечьте UX без пляжного мяча, возвысив вызов функции до высокопроизводительного образца веб-сервисной архитектуры, делая Facebook выглядит как Google+».

Или что-то совсем другое. Что я должен делать? Нравится начинать. Это мой вопрос. Я открыт для решений, связанных с нетипичным подходом — до тех пор, пока ваша рекомендация не вызывает отвращения (например, «используйте Silverlight») и/или временного вихря (например, «получите докторскую степень по компьютерной лингвистике, вы троглодит»), я готов. Заранее спасибо.


person fish2000    schedule 15.03.2012    source источник
comment
Еще одна вещь, которую я забыл упомянуть, может повлиять на решение на основе JavaScript на стороне клиента: NLTK, как и другие статистические модели, с которыми я сталкивался, часто должен работать поверх гигантской кучи обучающих данных (токенизатор Punkt, который я использую, имеет такое требование)... Я могу ошибаться в этом (на самом деле это было бы неплохо), но, очевидно, решение, в котором клиент должен d/l корпус, здесь не осуществимо.   -  person fish2000    schedule 15.03.2012


Ответы (4)


Я думаю, что, как вы написали в комментарии, объем данных, необходимых для работы эффективных алгоритмов, в конечном итоге не позволит вам делать что-то на стороне клиента. Даже базовая обработка требует большого количества данных, например частоты биграмм/триграмм и т. д. С другой стороны, символьные подходы также требуют значительных данных (правила грамматики, словари и т. д.). По моему опыту, вы не можете запустить хороший процесс НЛП, по крайней мере, без 3–5 МБ данных, что, как мне кажется, слишком много для современных клиентов.

Так что я бы все делал по проводу. Для этого я бы рекомендовал асинхронный/push-подход, возможно, использовать Faye или Socket.io? Я уверен, что вы можете добиться идеального и плавного UX, если пользователь не застревает, пока клиент ждет, пока сервер обработает текст.

person Blacksad    schedule 15.03.2012
comment
Действительно, это похоже на путь. Отдельное спасибо за рекомендацию Faye — я не смотрел на нее, но, похоже, она хорошо подходит для этой цели. - person fish2000; 23.03.2012

Существует довольно хорошая обработка естественного языка для node.js, которая называется natural. В настоящее время он не предназначен для работы в браузере, но авторы заявили, что хотят исправить это. Большая часть этого может даже уже работать, используя что-то вроде browserify или Require.JS.

person Linus Thiel    schedule 15.03.2012
comment
Спасибо за советы: на натуральном, который выглядит как хорошая упаковка для просмотра; а также браузер, о котором я тоже не знал. - person fish2000; 23.03.2012

winkjs имеет несколько пакетов для обработки естественного языка:

  1. Многоязычный токенизатор, который помечает каждый токен своим типом, таким как слово, число, электронная почта, упоминание и т. д.
  2. Теггер английской части речи (POS),
  3. Распознаватель именованных сущностей, не зависящий от языка,
  4. Полезные функции для общих задач NLP и многое другое, например. анализ настроений, лемматизатор, наивный байесовский классификатор текста и т. д.

Он содержит пакеты для статистического анализа, обработки естественного языка и машинного обучения в NodeJS. Код тщательно задокументирован для легкого понимания человеком и имеет тестовое покрытие ~ 100% для надежности для создания решений производственного уровня.

person sks    schedule 15.02.2019

Я думаю, вам следует развернуть отдельную службу, независимую от остальной части вашего приложения, которая выполняет большую часть работы на стороне сервера, но может отправлять клиенту несколько параметров в зависимости от того, что, по его мнению, клиент будет вводить дальше. Когда я читаю о ваших запросах, я думаю о функции автозаполнения поиска на таких сайтах, как Google, Quora и Yelp. Возможно, вы ввели в поле поиска только 3 или 4 символа, но эти сервисы отправили бы несколько вариантов запросов в зависимости от того, что, по их мнению, вы будете вводить дальше. Если вы динамически токенизируете текст, у вас может быть какая-то модель ngram (или другая более сложная языковая модель), которая сможет угадать, когда предложение закончится, и сказать внешнему интерфейсу, что делать для k наиболее вероятных будущих результатов. По сути, у вас есть серверная служба, которая может предварительно вычислять / кэшировать множество результатов, и иметь полуинтеллектуальный интерфейс, который может проверять, соответствует ли текущее состояние пользовательского ввода предсказанным состояниям, отправленным сервером несколькими 100 миллисекундами ранее и, по-видимому, мгновенно делать правильные вещи перед клиентом, не зависая в браузере, пытаясь выполнить некоторые действия с интенсивным использованием памяти/вычислений прямо там.

Два варианта, которые вы представили:
1) делать все на стороне клиента, что может быть быстро, но очень сложно из-за отсутствия существующих библиотек nlp js.

2) делать все на стороне сервера, что может быть проще, но делает ваше приложение медленным для пользователя

я прошу тебя сделать

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

person Aditya Mukherji    schedule 16.03.2012
comment
Не могли бы вы пояснить клиенту, что вы имеете в виду под множественными вариантами? Вы использовали эту фразу дважды; мой вопрос касается стратегии w / r / t, куда поместить вызов (ы) функции НЛП, но, поскольку моя текущая реализация идет, варианты этих вызовов не обсуждались. - person fish2000; 24.03.2012