8

I recently started working with ontologies and I am using Protege to build an ontology which I'd also like to use for automatically classifying strings. The following illustrates a very basic class hierarchy:

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

Eventually strings like Spain should be classified as CountryName or UE4564 would be a PrefixedNumericString.

However I am not sure how to model this knowledge. Would I have to first define if a character is alphabetic, numeric, etc. and then construct a word from the existing characters or is there a way to use Regexes? So far I only managed to classify strings based on an exact phrase like String and hasString value "UE4565".

Or would it be better to safe a regex for each class in the ontology and then classify the string in Java using those regexes?

4

4 回答 4

6

一种可能适用于此处的方法是机器学习,特别是如果本体很大/复杂或将来可能会发生变化,并且假设某些错误是可以接受的。

使用这种方法的过程大纲可能是:

  1. 定义一个您可以从每个字符串中提取的与您的本体相关的特征集(下面的一些示例)。
  2. 收集字符串的“训练集”及其真正匹配的类别。
  3. 从每个字符串中提取特征,并在这些数据上训练一些机器学习算法。
  4. 使用经过训练的模型对新字符串进行分类。
  5. 根据需要重新训练或更新您的模型(例如添加新类别时)。

为了更具体地说明,这里有一些基于您的本体示例的建议。

一些可能适用的布尔特性:字符串是否匹配正则表达式(例如Qtax建议的);该字符串是否存在于预先构建的已知城市名称列表中;它是否存在于已知的国名列表中;存在大写字母;字符串长度(非布尔值)等

因此,例如,如果您总共有 8 个特征: 匹配上面提到的 4 个正则表达式;以及此处建议的其他 4 个,则“西班牙”将表示为 (1,1,0,0,1,0,1,5) (匹配前 2 个正则表达式但不匹配后两个,是城市名称,但不是国家名称,有一个大写字母,长度为 5)。

这组特征将代表任何给定的字符串。

要训​​练和测试机器学习算法,您可以使用WEKA。我将从基于规则或树的算法开始,例如 PART、RIDOR、JRIP 或 J48。

然后可以通过 Weka 从 Java 内部或作为外部命令行使用经过训练的模型。

显然,我建议的功能与您的 Ontology 几乎 1:1 匹配,但假设您的分类更大且更复杂,这种方法可能是成本效益方面最好的方法之一。

于 2012-03-13T14:32:18.820 回答
2

我对 Protege 一无所知,但您可以使用正则表达式来匹配大多数情况。唯一的问题是区分国家和城市名称,如果没有任何一个的完整列表,我看不出你怎么能做到这一点。

以下是您可以使用的一些表达式:

  • 字母串:

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

  • 字母数字字符串:

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

  • 前缀数字字符串:

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

  • 数字字符串:

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

于 2012-03-12T14:46:08.397 回答
2

一个特定的字符串是一个实例,因此您需要一些代码来对特定实例进行基本断言。该代码本身可能包含正则表达式的使用。一旦你有了这些断言,你就可以使用你的本体来推理它们。

困难的部分是您必须决定要建模的级别。例如,你会谈论个别角色吗?你可以,但这不一定是明智的。您还面临着负面信息很尴尬的挑战(因为此类模型的基本模型是直觉主义的,IIRC),这意味着(例如)您会知道字符串包含数字字符但不包含它是纯粹的数字。是的,您知道您没有断言该实例包含字母字符,但您不知道这是因为字符串没有,还是只是因为还没有人这么说。这东西太难了!

如果你确切地知道你打算用它解决什么问题,那么编写一个本体要容易得多,因为这至少可以让你首先弄清楚你需要建立哪些事实和关系。毕竟,有很多可能的事情可以说是真实但无关紧要的(“如果太阳戴上帽子,他就会出来玩”)。

于 2012-03-12T15:49:37.970 回答
1

直接回答您的问题,首先检查给定标记是数字、字母数字还是字母(您可以在此处使用正则表达式),然后将其分类。通常,您正在寻找的方法称为令牌的泛化层次结构或分层特征选择(Google it)。基本思想是您可以将每个标记视为一个单独的元素,但这不是最好的方法,因为您不能将它们全部覆盖 [*]。相反,您使用令牌之间的共同特征(例如,2000并且1981是不同的令牌,但它们具有共同特征,即 4 位数字和可能的年份)。然后你有一个四位数字的类,另一个用于字母数字的类,依此类推。这种泛化过程可帮助您简化分类方法。

通常,如果您从一串标记开始,您需要对它们进行预处理(例如,删除标点符号或特殊符号、删除不相关的单词、词干等)。但是也许您可以使用一些符号(例如,城市和国家之间的标点符号 - 例如Melbourne, Australia),因此您将一组有用的标点符号分配给其他符号 ( #) 并将其用作上下文(因此下次您找到一个未知单词时到已知国家旁边的逗号,您可以使用该知识假设未知单词是城市。

无论如何,这是使用本体(基于术语分类)进行分类背后的一般思想。您可能还想阅读有关词性标记的信息。

顺便说一句,如果您只想拥有 3 个类别(数字、字母数字、字母),一个可行的选择是使用编辑距离(更可能的是,UA4E30 属于字母数字或数字类别,考虑到它不t 对应于传统格式的前缀数字字符串?)。因此,您假设将未知令牌转换为已知令牌的每个操作(插入、删除、替换)都有成本。

最后,尽管您说您正在使用 Protege(我没有使用过)来构建您的本体,但您可能需要查看WordNet

[*] 有一些概率方法可以帮助您确定未知令牌的概率,因此此类事件的概率不为零。通常,这是在隐马尔可夫模型的上下文中完成的。实际上,这可能有助于改进 etov 给出的建议。

于 2012-03-16T18:53:10.343 回答