Онтологическая классификация строк - PullRequest
8 голосов
/ 06 марта 2012

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

String
|_ AlphabeticString
   |_ CountryName
   |_ CityName
|_ AlphaNumericString
   |_ PrefixedNumericString
|_ NumericString

В конце концов строки типа Spain должны быть классифицированы как CountryName или UE4564 будет PrefixedNumericString.

Однако я не уверен, как моделировать это знание. Должен ли я сначала определить, является ли символ буквенным, числовым и т. Д., А затем составить слово из существующих символов или есть способ использовать регулярные выражения? До сих пор мне удавалось классифицировать строки только по точной фразе, такой как String and hasString value "UE4565".

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

Ответы [ 4 ]

6 голосов
/ 13 марта 2012

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

Схема процесса, использующего этот подход, может быть такой:

  1. Определите набор функций, который вы можете извлечь из каждой строки, относящейся к вашей онтологии (некоторые примеры ниже).
  2. Collect a "набор "строк" и их истинно соответствующих категорий.
  3. Извлечение признаков из каждой строки и обучение некоторому алгоритму машинного обучения на этих данных.
  4. Использование обученной модели для классификации новых строк.
  5. Возобновите или обновите вашу модель какнеобходимо (например, при добавлении новых категорий).

Чтобы проиллюстрировать более конкретно, вот несколько предложений, основанных на вашем примере онтологии.

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

Итак, если, например, у вас есть всего 8 функций: соответствует 4 регулярным выражениям, упомянутым выше;и дополнительные 4, предложенные здесь, тогда «Испания» будет представлена ​​как (1,1,0,0,1,0,1,5) (соответствует первым 2 регулярным выражениям, но не двум последним, это название города, ноне название страны, заглавная буква и длина 5).

Этот набор функций будет представлять любую заданную строку.

для обучения и тестирования алгоритма машинного обучения, вы можете использовать ВЕКА .Я бы начал с алгоритмов, основанных на правилах или деревьях, например PART, RIDOR, JRIP или J48.

Затем обученные модели можно использовать через Weka либо из Java, либо как внешнюю командную строку.

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

2 голосов
/ 12 марта 2012

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

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

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

2 голосов
/ 12 марта 2012

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

Вот некоторые выражения, которые вы можете использовать:

  • AlphabeticString:

    ^[A-Za-z]+\z (ASCII) или ^\p{Alpha}+\z (Unicode)

  • AlphaNumericString:

    ^[A-Za-z0-9]+\z (ASCII) или ^\p{Alnum}+\z (Unicode)

  • PrefixedNumericString:

    ^[A-Za-z]+[0-9]+\z (ASCII) или ^\p{Alpha}+\p{N}+\z (Unicode)

  • NumericString:

    ^[0-9]+\z (ASCII) или ^\p{N}+\z (Unicode)

1 голос
/ 16 марта 2012

Отвечая непосредственно на ваш вопрос, вы начинаете с проверки, является ли данный токен числовым, буквенно-цифровым или буквенным (вы можете использовать регулярное выражение здесь), а затем вы классифицируете его как таковой.В общем, подход, который вы ищете, называется обобщающей иерархией токенов или иерархическим выбором объектов (Google it).Основная идея заключается в том, что вы можете рассматривать каждый токен как отдельный элемент, но это не лучший подход, поскольку вы не можете охватить их все [*].Вместо этого вы используете общие характеристики для токенов (например, 2000 и 1981 являются разными токенами, но они имеют общую особенность - это 4-значные числа и, возможно, годы).Затем у вас есть класс для четырехзначных чисел, другой для буквенно-цифровых и так далее.Этот процесс обобщения помогает упростить ваш классификационный подход.

Часто, если вы начинаете со строки токенов, вам необходимо предварительно обработать их (например, удалить знаки препинания или специальные символы, удалить слова, которые не относятся к делу)., и т. д.)Но, возможно, вы можете использовать некоторые символы (скажем, знаки препинания между городами и странами - например, Melbourne, Australia), поэтому вы назначаете этот набор полезных символов пунктуации другому символу (#) и используете его в качестве контекста (поэтому в следующий развы находите неизвестное слово рядом с запятой рядом с известной страной, вы можете использовать это знание, чтобы предположить, что неизвестное слово является городом.

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

Кстати, если вы хотите иметь только 3 категории (числовые, буквенно-цифровые, буквенные), жизнеспособным вариантом будет использование расстояние редактирования (что более вероятно, что UA4E30 относится к алфавитно-цифровой или числовой категории, учитывая, что он не соответствует традиционному формату префиксных числовых строк?)Таким образом, вы берете на себя стоимость каждой операции (вставка, удаление, подстановка), которая преобразует ваш неизвестный токен в известный наe.

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

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

...