gpt4 book ai didi

java - 创建自己的POS Tagger

转载 作者:行者123 更新时间:2023-12-02 22:12:26 25 4
gpt4 key购买 nike

我发现Stanford POS Tagger很好,但是不知何故我发现自己需要创建自己的POS标记器。

在过去的两个星期中,我在各处徘徊,讨论是否要从解析树开始,或者一旦有了pos标记器就无法解析树,就使用丑陋的CFG和NFA,以便它们可以帮助我创建POS标记器什么都不是。

我在这里结束了这个问题,问老年人,从哪里开始POS标记。
(选择的语言是Python,但是C和JAVA不会受到伤害)。

最佳答案

这取决于您的最终目标是什么。

如果目标是执行语法分析,则即确定主题,谓词,其参数,其修饰符等,然后甚至可能执行语义分析,那么您不必担心POS标记器。相反,您应该首先查看各种语法分析方法,特别是基于短语结构的方法,概率方法和有限状态方法,然后确定要用于此目的的工具。该决定将取决于您对速度和准确性的要求是什么,需要多少时间进行长期改进和维护以及其他因素。一旦确定了正确的工具(或实现策略),您可能最终将不再需要标记器。原因是许多语法分析策略从根本上不需要标记器:它们仅执行字典查找,该查询为每个单词返回一个或多个可能的POS标签;语法分析器会隐式地执行歧义消除(即确定这些标签中的哪一个实际上是正确的)。一些语法分析器可能希望您在字典查找后应用POS标记器,但是它们也会告诉您要使用哪个标记器,因此,对您问题的答案将很自然地随之而来。

另一方面,如果您的目标不需要全面的语法分析(即),而仅是词性标记,则建议您在决定创建自己的替代方法之前先考虑一下现有的替代方法。可能的选择包括但不限于:

  • Stanford Tagger
  • Mallet Simple Tagger
  • ANNIE tagger(这是嵌入到较大的NLP框架中的Brill样式标记器)
  • TreeTagger
  • Brill tagger
  • SENNA tagger

  • 哪一种最适合您的需求取决于许多因素,而不一定按以下优先顺序排列:
  • 不透明:您是否打算通过维护异常列表和更正后的规则(可能需要较长时间)来进行改正以改善结果?在这种情况下,您可能需要的不仅是开源的标记器,而且还需要使用一种能够对其修改的歧义消除策略进行手动修改的方法。在基于规则的或TBL标记器(例如Brill标记器)中,以及在某种程度上基于决策树学习的标记器(例如TreeTagger)中,这更容易实现;在基于隐马尔可夫模型(HMM)的标记器和基于条件随机字段(CRF)的标记器(例如Mallet Simple Tagger)中,难度和可能性都受到限制,并且非常困难(纯正的校正后异常除外)列表中)基于神经网络(例如SENNA)的标记器中。
  • 目标语言:您是否只需要英语或其他语言的语言? TreeTagger对许多欧洲语言提供了现成的支持,但是上面列表中的其他语言却没有。添加对语言的支持总是需要一本词典,它通常需要一个带注释的训练语料库(这可能很昂贵),有时还需要您编写或修改几百个初始规则(例如,如果使用Brill-tagger方法用过的)。
  • 框架和编程语言: Mallet和Stanford适用于Java,TreeTagger使用C(但不是开放源代码;有Python和Java包装器,但它们可能会导致性能显着下降并出现其他问题(‡)) ,SENNA是C开源的,ANNIE是Java的并且是为GATE框架制作的,依此类推。这些标记者需要的环境有所不同,将它们移出自然栖息地可能会很痛苦。 NLTK(Python)为其中一些提供了包装器,但是它们通常并不涉及将源代码实际嵌入到Python中。取而代之的是,他们只是对要标记的每段文本执行系统调用。这具有严重的性能影响。
  • 速度:如果您每秒仅处理几个句子,则任何标记器都将能够处理该句子。但是,如果您要处理数TB的数据,或者需要应对使用中的极端峰值,则需要在评估和决策过程中执行正确的压力测试。从个人经验中我知道TreeTagger和SENNA的速度非常快,斯坦福的速度要慢得多,而NLTK的包装器的速度通常要慢几个数量级。无论如何,您都需要测试。请注意,通过将输入划分为多个分区并并行运行多个标记过程,可以以一种直接的方式使POS标记并行化。内存占用空间通常不是标记程序本身的问题(但是如果标记程序是已完全加载到内存中的常规NLP框架的一部分,则可能是这样)。

  • 最后,如果现有标记器都不满足您的需要,而您确实决定创建自己的标记器,则仍然需要做出与上述类似的决定:正确的方法取决于准确性,速度,维护和与多语言相关因素。上面的示例列表很好地表示了POS标记的主要方法,即Rule/TBL样式(Brill),HMM/CRF(Mallet),基于熵的(Stanford),决策树学习(TreeTagger),神经网络(SENNA)。即使您决定自己制作,也最好研究一些现有的工具,以了解它们的工作方式以及问题所在。

    关于多语言的最后说明:上面的经典POS标记要求在应用标记器之前将输入标记化(否则它们将隐式执行简单的标记化)。这不适用于无法使用标点符号和空格作为标记边界进行标记的语言,即中文,日语,泰语(某种程度上为韩语)以及其他几种语言。对于这些,您将需要使用专门的 token 生成器,并且这些 token 生成器通常会在一个步骤中同时执行 token 生成和POS标记。

    (‡)我不了解 Java wrapper,但是上次我检查(大约一年前)时 Python wrapper遇到了几个问题:它仅适用于Python 2,它以相当复杂的方式使用系统调用,这是确保在处理完每个输入后,树状标记器刷新其缓冲区是必要的。后者有两个结果:处理速度比直接使用Tree Tagger时慢,并且某些语言无法使用完整的命令行工具管道,因为那时缓冲区刷新太复杂了。

    关于java - 创建自己的POS Tagger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15921417/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com