Java lib:用于具有不同语义的文本的分析器

时间:2012-03-14 15:44:57

标签: java compare analysis lexical-analysis

我需要一个java lib,它会比较两个不同的文本和一些相似之处,并告诉我它们是否相关。

例如,我会比较其中一个

a)“COMP 150.00 MG X 20.00 UN”

b)“COMP 150.00 MG X 60.00 UN”

这一个

c)“150 mg comp.rec.x 20”

并且lib应该告诉我第一个对应而第二个不对,因为 a) c)都提到了“ 150毫克胶囊和包装带来20个单位“和 b)指的是60个单位包..

我的另一个想法是关于正则表达式,但我不太喜欢它们,所以这就是我要求你帮助的原因。

提前致谢。

2 个答案:

答案 0 :(得分:0)

实现Comparable接口并覆盖CompareTo方法。 如果没有找到答案,请用其他例子解释问题。

答案 1 :(得分:0)

如果文本变体总是以相同的方式构建,则正则表达式可能是解决此问题的一种方法。基本上你会根据一组表达式检查每个文本,看看它们是否匹配。根据变体的不同,表达式可能很简单,也可能需要更复杂。

对于上面的情况,第一个表达式可能如下所示:

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

由此可以得出以下表达式:
^COMP (\d+(?:\.\d+)?) MG X ([\d]+(?:\.\d+)?) UN$
(这假设空格的数量始终相等,并且始终使用MGUN)。

第二个表达:

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.31.
  • (\d+(?:\.\d+)?)表示至少一个数字,可选地后跟一个点,后跟至少一个数字。这将匹配1.2312.3123,但不匹配1..21.2.3

如果您有这些表达式,请在文本上应用正确的表达式(如果您知道,否则先测试)并提取这两个组。然后比较这些组的值。

注意:不要忘记在Java字符串中必须转义反斜杠,因此\d将被写为"\\d"等。