【问题标题】:Ontology-based string classification基于本体的字符串分类
【发布时间】:2012-03-23 22:38:48
【问题描述】:

我最近开始使用本体,我正在使用 Protege 构建一个本体,我还想用它来自动分类字符串。下面说明了一个非常基本的类层次结构:

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

最终像Spain 这样的字符串应该被归类为CountryNameUE4564 将是PrefixedNumericString

但是我不确定如何对这些知识进行建模。我是否必须首先定义一个字符是字母、数字等,然后从现有字符构造一个单词,还是有办法使用正则表达式?到目前为止,我只能根据 String and hasString value "UE4565" 之类的确切短语对字符串进行分类。

或者最好为本体中的每个类都设置一个正则表达式,然后使用这些正则表达式在 Java 中对字符串进行分类?

【问题讨论】:

    标签: regex string classification ontology protege


    【解决方案1】:

    一种可能适用于此的方法是机器学习

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 这是我最近读过的最好的答案!事实上,它非常好,以至于我现在想自己尝试一下。谢谢,etov
    【解决方案2】:

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

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

    无论如何,这就是使用本体(基于术语分类)进行分类背后的总体思路。您可能还想了解part-of-speech tagging

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        我对 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)

        【讨论】:

        • 一个字符串既可以是城市名称也可以是国家名称(嗯,概念上基于目前给出的事实)。本体不需要单继承。
        猜你喜欢
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 2011-11-28
        • 2014-03-13
        • 1970-01-01
        相关资源
        最近更新 更多