我想解析马拉雅拉姆语(印度语言)文本语料库以开发问答系统。是否有任何 NLP 工具用于对英语以外的语言进行语义解析。
2 回答
这听起来可能又大又可怕。
据我所知,没有可以学习的免费软件问答系统,即使它已记录在案。
问答分为两部分:
- 理解问题
- 在一些预处理数据集中查找响应(比如wikidata.org)
这两个步骤都需要类似的算法。
垂直问答管道
要实现垂直问答系统,您需要能够在高水平上解析“马拉雅拉姆语”和其他印度语言,这意味着至少要做到:
将文本分成段落,然后分成句子和单词。你必须能够说出一个句子的结尾。例如,根据语言的不同,句子可能不会以相同的字符结尾。或缩写。like
ie.
不是句末。I.B.M.
不是三个句子等。句子如何开头,在英语中有一个大写字母,但并非所有大写字母都像专有名词一样开头一个句子,例如“乔姆斯基还活着吗?”部分语音标记:告诉名词、专有名词、动词等。
创建命名实体识别器:识别人名、组织名称、位置、时间表达、数量、货币价值、百分比等。
构建语义树依赖关系:例如,“she”或“he”指的是哪个命名实体?谁是句子的主语,补语等。
创建文本生成工具。鉴于您的程序理解问题,找到了可能的答案,它必须用自然语言对其进行格式化。
幸运的是,有很多例子可以让你从中获得灵感。如果你想在 Python 上工作,你会想学习Spacy(想要快速和最新的 NLP 库)和书籍附带的NLTK。
算法可以在语言之间共享。
更窄的方法
如果你不想做所有的步骤,只解决回答问题的子问题。您需要简化问题并消除变量/未知数:
您必须构建一个包含已拆分和标记的事实的数据库,以便您可以通过执行 SQL 查询来简单地回答问题。例如,给定以下事实元组:
谁:印度 什么:赢得什么:板球锦标赛 时间:2015
在这里,我将标记简化为WHO
,WHEN
和WHAT
。
很容易回答这个问题:
WHO:?什么:赢得什么:板球锦标赛时间:2015
IE。
谁赢得了 2015 年的板球冠军?
同样,问题必须是“可预测的”并且易于解析其他示例:
谁做了什么
什么是什么
何时何人
如果您可以识别/解析 a WHO
, aWHEN
并猜测WHAT
用户提供的句子中的 a 是什么,这将起作用。您也可以进一步简化并说WHEN
s 只能是 4 位数字,即。年。并进一步约束这类问题,简化解析部分。
这将引导您找到一个程序,该程序实际上可以以更自然和更正确的方式回答问题,而原始 ElasticSearch 或 PostgreSQL 等信息检索 (IR) 系统会这样做。
事实数据库
您可能需要使用语义网络查看免费的 ConceptNet(如果您需要帮助或想贡献印度维基词典,请向邮件列表发送消息)或babelnet。还有wordnet。
课程
我非常喜欢Jurafsky 课程,其中有一个关于 QA 的特定章节。Jurafsky 写了一本完整的 NLP 简介。
搜索提示
在万维网上搜索有关以您查找信息的语言的 NLP 算法的信息。说一个法语词形还原器,我在法语研究门户网站上进行搜索,或者通过使用本机 ie 的搜索引擎进行搜索。法语措辞。美国搜索引擎在其他语言中的表现不如英语,所以要准备好分页(也可以使用搜索工具)。
文化
在自然语言处理和人工智能方面建立良好的文化。看总结或信息检索(很容易),您将学习可以在另一个问题中重复使用的方法。例如,如果您查看基于规则的机器翻译,您会了解到在行业中他们使用简化的、不含歧义的自然语言语法来准确翻译文档。这些文档是用简单的英语(例如SUBJECT VERB NOUN
)编写的,可以很容易地为其创建计算机语法(如计算机语言语法),并且可以很容易地进行逐字翻译。这是解决子问题以实现更高质量的实例。这就是我想出上述狭窄方法的方式。
算法
最后但并非最不重要的一点是,大多数子问题解决方案属于以下三个算法类别之一:
代数和图论试图理解数据并解释其结果。例如 PageRank、SimRank、CoSimRank、逻辑编程。
我将其与术语动力学进行比较的统计数据,其中基本上“您解决了问题但不知道为什么”。这就是所谓的“机器学习”,在业界主要用于解决与 NLP 相比实际上狭窄的问题。但是仍然存在机器学习算法来解决自然语言问题,例如主题建模,但这不是唯一的例子。统计编程很流行。
混合:这意味着两种方法的混合。
阅读乔姆斯基和统计学习的两种文化,了解更多关于二分法和研究/工程背景的信息。
一般提示
你不需要了解和理解每一种算法和科学依据,只要你了解它们的局限性以及如何使用它们。
我认为,即使我主要阅读英语,用我的“母语”法语阅读也会扩大我的理解。
保存你找到的文件和资源,事情来来去去。
当我试图为英语以外的语言寻找语义解析器时,我遇到了两个主要问题:寻找带有语义注释的训练数据和类似 FrameNet 的语义数据库。
由于即使是流行语言也几乎不可能找到 FrameNet 的良好替代品,我怀疑这在您的情况下是不可能的。
一种可能性是使用语义角色标签。这种浅层语义解析不如真正的语义解析器详细,但也许它是朝着正确方向迈出的一步。我知道的 SRL 解析器本身并不适用于英语,而是带有已经训练过的英语语言模型。所以最大的挑战是为你的语言训练这样一个模型,这需要你拥有一个带有语义注释的大型语料库。大多数解析器需要 CoNLL 格式的数据,因为这里有多种语言的语料库。
mate-tools
他们主要关注依赖解析,但也包含一个可以训练的语义角色标注器。它们是用 C++ 编写的独立工具,因此如果您想将它们集成到您的程序中,您可能需要构建一些 shell 脚本的工具链。
ClearNLP
与 mate-tools 不同,ClearNLP 可以用作 Java 库,并且该项目也在积极开发中。它们还支持新 SRL 模型的训练,这是一个相对较新的功能。
由于我怀疑您是否有时间和资源为您的语言创建语义注释语料库,一个可能的解决方法是使用非常好的机器翻译系统将您的语料库翻译成英语,然后应用语义解析。这种方法很容易出错,因此我强烈建议更正翻译后的输出,即使这是一项耗时的任务。
我目前正在使用SEMAFOR解析器(GitHub)。它是用 Java 编写的,带有预训练的英语模型,并在易于阅读的 XML 文件中创建 FrameNet 注释。它远非完美(就像目前所有的语义解析器一样),但它创建了一个你可以使用的输出。如果您选择使用它,最好忽略预编译的 jar,并从他们的 GitHub 页面下载最新的代码。
我知道这不是完美的解决方案,但它是我会选择的最快和最可靠的方法。