Струнный анализ и классификация - PullRequest
5 голосов
/ 29 ноября 2011

В свободное время я занимаюсь разработкой финансового менеджера с использованием Java и Swing GUI.Когда пользователь добавляет новую запись, ему предлагается заполнить: Moneyamount, Date, Comment и Section (например, Car, Salary, Computer, Food, ...)

Разделы создаются "на лету"».Когда пользователь входит в новый раздел, он будет добавлен в раздел jcombobox для дальнейшего выбора.Другое дело, что комментарии могут быть на разных языках.Таким образом, список жестко закодированных слов и синонимов был бы огромен.

Итак, мой вопрос, можно ли проанализировать комментарий (например, «Топливо», «Автосервис», «Обед в **»)и предварительно выберите подходящий раздел.Моей первой мыслью было сделать это с помощью нейронной сети и учиться на входе, если пользователь выбирает другой раздел.

Но моя проблема в том, что я вообще не знаю, с чего начать.Я попробовал "encog" с Eclipse и сделал несколько обучающих программ (XOR, ...).Но все они используют только двойные значения как вход / выход.

Кто-нибудь может дать мне подсказку, как начать или любое другое возможное решение для этого?

Здесь естьисполняемый JAR (текущее состояние разработки, требуется Java7) и Sourceforge Page

Ответы [ 6 ]

1 голос
/ 29 ноября 2011

Забудьте о нейронных сетях. Это высокотехнологичная и специализированная область искусственного интеллекта, которая, вероятно, не подходит для вашей проблемы и требует серьезного опыта. Кроме того, есть много простых и лучших решений для вашей проблемы.

Первое очевидное решение, создайте список слов и синонимов для всех ваших разделов и проанализируйте эти синонимы. Затем вы можете собирать комментарии в Интернете для анализа синонимов или использовать анализ комментариев / разделов, предоставленных вашими пользователями, для статистического выявления связей между словами и т. Д. *

Существует бесконечное количество возможных решений, от самых простых до самых излишних. Теперь вам нужно определить, является ли эта особенность вашей системы критической (предварительное заполнение? Возможно, нет) ... и что принесет вам любое усилие по разработке. Один час работы может принести вам удовлетворение на 80%, а достижение 90% - одна неделя работы. Это действительно того стоит?

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

0 голосов
/ 29 ноября 2011

Алгоритм машинного обучения, такой как искусственная нейронная сеть, не кажется здесь лучшим решением. ANN могут использоваться для классификации нескольких классов (т. Е. «Какой из предоставленных предварительно обученных классов представляет вход?», А не «представляет ли вход X?»), Что соответствует вашему варианту использования. Проблема заключается в том, что они являются контролируемыми методами обучения, и поэтому вам необходимо предоставить список пар ключевых слов и классов (разделов), охватывающий все возможные входные данные, которые будут предоставлены вашими пользователями. Это невозможно, и на практике ANN проходят переподготовку, когда доступно больше данных для получения лучших результатов и создания более точной границы принятия решений / представления функции, которая отображает входные данные в выходные данные. Это также предполагает, что вы знаете все возможные классы до того, как начнете, и каждый из этих классов имеет вводимые вами значения обучения.

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

(Как сказал Маклема, выход из ANN всегда будет плавающим, при этом каждое значение представляет близость к классу - или классу с уровнем неопределенности.)

Лучшим решением было бы использовать какой-либо граф отношений слов или синонимов. * * * * * * * * * * * * * * * * * * * * * * * * Могла бы быть здесь полезной моделью «1007 *».

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

0 голосов
/ 29 ноября 2011

Мне кажется, что будет делать следующее:

  • статистика жестких слов
  • возможно, урок по стеммингу (английский / испанский), который сокращает слово "обеды" до "обеда".
  • список наиболее часто встречающихся слов (the, at, a, for, ...)

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

0 голосов
/ 29 ноября 2011

Если у вас много категорий, я бы использовал что-то вроде Apache Lucene, где вы могли бы индексировать все категории по их именам и потенциальным ключевым словам / фразам, которые могут появиться в описании пользователя. Затем вы можете просто запустить описание через Lucene и использовать категорию с самым подходящим соответствием в качестве «наилучшей догадки».

P.S. Входы и выходы нейронной сети всегда будут двойными или плавающими со значением от 0 до 1. Что касается того, как реализовать сопоставление строк, я даже не знаю, с чего начать.

0 голосов
/ 29 ноября 2011

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

0 голосов
/ 29 ноября 2011
String myString =  new String(paramInput);

if(myString.contains("FUEL")){
//do the fuel functionality
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...