Java lib: анализатор для текстов с различной семантикой - PullRequest
0 голосов
/ 14 марта 2012

Мне нужна библиотека Java, которая будет сравнивать 2 разных текста с некоторыми сходствами и сообщать мне, связаны они или нет.

Например, я бы сравнил один из этих

а) "КОМП 150.00 МГ Х 20.00 ООН"

b) "КОМП 150,00 МГ Х 60,00 ООН"

с этим

c) "150 мг, comp.rec.x 20"

и библиотека должна сказать мне, что первый соответствует, а второй нет, потому что a) и c) оба упоминают лекарство, которое представлено в "150 мг капсулах и пакет приносит 20 единиц ", а b) относится к пачке 60 единиц.

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

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

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

Для приведенного выше случая первое выражение может выглядеть так:

COMP 150.00 MG X 20.00 UN -> (identifier) (capsule weight) X (num units)

Отсюда можно получить следующее выражение:
^COMP (\d+(?:\.\d+)?) MG X ([\d]+(?:\.\d+)?) UN$
(это предполагает, что количество пробелов всегда равно и что вы всегда используете MG и UN).

Второе выражение:

150 mg comp.rec.x 20 -> (capsule weight) comp.rec.x (num packages)

Может быть получено следующее выражение:
^(\d+(?:\.\d+)?) mg comp\.rec\.x (\d+(?:\.\d+)?)$

Вы увидите, что оба выражения дважды содержат следующую часть: ([\d]+(?:\.\d+)?)
Эти части записывают числа в группу и позволяют вам затем анализировать этот текст, например, в Double. Вот краткая разбивка этого под-выражения:

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

Из вышеперечисленных частей вы получаете следующее:

  • (?:\.\d+)? означает не более одной точки, за которой следует хотя бы одна цифра. Это будет соответствовать .123, но не .1.2.3 или 1.
  • (\d+(?:\.\d+)?) означает, по крайней мере, одну цифру, за которой необязательно следует точка, за которой следует, по крайней мере, еще одна цифра. Это будет соответствовать 1.23, 12.3 или 123, но не 1., .2 или 1.2.3.

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

Примечание: не забывайте, что в строках Java вы должны избегать обратной косой черты, поэтому \d будет записано как "\\d" и т. Д.

0 голосов
/ 14 марта 2012

Реализация сопоставимого интерфейса и переопределение метода CompareTo.Если ответ не найден, объясните вопрос другим примером.

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