我最近开始使用本体,我正在使用 Protege 构建一个本体,我也想用它来自动分类字符串。下面说明了一个非常基本的类层次结构:
String
|_ AlphabeticString
|_ CountryName
|_ CityName
|_ AlphaNumericString
|_ PrefixedNumericString
|_ NumericString
最终像
Spain
这样的字符串应该被归类为 CountryName
或者 UE4564
将是一个 PrefixedNumericString
。但是,我不确定如何对这些知识进行建模。我是否必须首先定义一个字符是字母、数字等,然后从现有字符构造一个单词还是有办法使用正则表达式?到目前为止,我只能根据
String and hasString value "UE4565"
之类的确切短语对字符串进行分类。或者最好为本体中的每个类保护一个正则表达式,然后使用这些正则表达式对 Java 中的字符串进行分类?
最佳答案
一种可能适合这里的方法,特别是如果本体很大/复杂或将来可能会发生变化,并且假设某些错误是可以接受的,则是 机器学习 .
使用这种方法的流程概要可能是:
为了更具体地说明,这里有一些基于您的本体示例的建议。
一些可能适用的 bool 特性:字符串是否匹配正则表达式(例如 Qtax 建议);该字符串是否存在于预先构建的已知城市名称列表中;它是否存在于已知的国家/地区名称列表中;存在大写字母;字符串长度(不是 bool 值)等。
因此,例如,如果您共有 8 个特征: 匹配上述 4 个正则表达式;和这里建议的另外 4 个,那么“西类牙”将表示为 (1,1,0,0,1,0,1,5)(匹配前 2 个正则表达式而不是后两个,是一个城市名称,但不是国家名称,有一个大写字母,长度为 5)。
这组特征将代表任何给定的字符串。
要训练和测试机器学习算法,您可以使用 WEKA .我将从基于规则或树的算法开始,例如PART、RIDOR、JRIP 或 J48。
然后可以通过 Weka 从 Java 内部或作为外部命令行使用经过训练的模型。
显然,我建议的功能与您的本体几乎 1:1 匹配,但假设您的分类更大、更复杂,这种方法可能是成本效益方面最好的方法之一。
关于regex - 基于本体的字符串分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583906/