【问题标题】:Build a Part-of-Speech Tagger (POS Tagger)构建词性标注器(词性标注器)
【发布时间】:2011-08-17 06:47:41
【问题描述】:

我需要用 Java 构建一个 POS 标记器,并且需要知道如何开始。是否有代码示例或其他资源可以帮助说明词性标注器的工作原理?

【问题讨论】:

  • nlp 是一个难以解决的问题。您应该从寻找已发表的解决您的问题的文章开始,选择一些建议的解决方案,实施它们,然后选择对您产生更好结果的解决方案。
  • 嗯...您从头开始构建自己的吗?因为如果没有,您可以只使用 Andrey 下面提到的 Stanford 或 WColen 提到的 OpenNLP。斯坦福是我的首选;这是相当不错的。如果你必须建造一个,那听起来像是一个家庭作业项目。否则真的没有理由自己做(我至少能想到没有理由哈哈)。
  • 创建一个词性标注器是一项艰巨的任务。理想情况下,您将获得一个带注释的语料库,对其进行解析,获得令牌频率,获得似然估计,平滑数据,然后构建模型。该模型可以仅基于您现有的随机数据,使用诸如 logit 或 HMM 之类的东西,或者您可以使用带有特征的监督干预以及您依赖特征的 Maxent 或 Perceptron 模型。您还可以通过使用类似于 Brille 的基于规则的标记器来完全避免概率模型。

标签: java nlp pos-tagger


【解决方案1】:

试试Apache OpenNLP。它包括一个词性标注工具。您可以从here下载现成的英文模型。

该文档提供了有关如何在 Java 应用程序中使用它的详细信息。基本上你需要以下内容:

加载 POS 模型

InputStream modelIn = null;

try {
  modelIn = new FileInputStream("en-pos-maxent.bin");
  POSModel model = new POSModel(modelIn);
}
catch (IOException e) {
  // Model loading failed, handle the error
  e.printStackTrace();
}
finally {
  if (modelIn != null) {
    try {
      modelIn.close();
    }
    catch (IOException e) {
    }
  }
}

实例化词性标注器

POSTaggerME tagger = new POSTaggerME(model);

执行它

String sent[] = new String[]{"Most", "large", "cities", "in", "the", "US", "had", "morning", "and", "afternoon", "newspapers", "."};          
String tags[] = tagger.tag(sent);

请注意,词性标注器需要一个标记化的句子。 Apache OpenNLP 还提供工具和模型来帮助完成这些任务。

如果您必须训练自己的模型,请参阅documentation

【讨论】:

    【解决方案2】:

    您可以检查现有的标记器实现。

    请参阅 Java 中的斯坦福大学 POS 标记器(由 Kristina Toutanova 编写),它在 GNU 通用公共许可证(v2 或更高版本)下可用,源代码编写良好且文档清晰:

    http://nlp.stanford.edu/software/tagger.shtml

    关于标记的好书是: 语音和语言处理(第 2 版),作者 Daniel Jurafsky、James H. Martin

    【讨论】:

    • 鉴于其复杂的(一次性)概率模型,我不确定斯坦福 POS 标记器是否是一个好的开始实施。不过,Jurafsky & Martin 是值得一读的书。
    【解决方案3】:

    有一些 POS/NER 标记器被广泛使用。

    OpenNLP Maxent POS 标注器:使用 Apache OpenNLP。

    Open NLP 是一个来自 Apache 的强大的 java NLP 库。它为 NLP 提供了各种工具,其中之一是词性 (POS) 标注器。通常 POS 标记器用于找出文本中的结构语法结构,您使用标记数据集,其中每个单词(短语的一部分)都用标签标记,您从该数据集构建 NLP 模型,然后对于新文本,您可以使用模型为文本中的每个单词生成标签。

    示例代码:

    public void doTagging(POSModel model, String input) {
        input = input.trim();
        POSTaggerME tagger = new POSTaggerME(model);
        Sequence[] sequences = tagger.topKSequences(input.split(" "));
        for (Sequence s : sequences) {
            List<String> tags = s.getOutcomes();
            System.out.println(Arrays.asList(input.split(" ")) +" =>" + tags);
        }
    }
    

    详细的博客以及如何使用它的完整代码:

    https://dataturks.com/blog/opennlp-pos-tagger-training-java-example.php?s=so

    基于斯坦福 CoreNLP 的 NER 标记器:

    Stanford 核心 NLP 是迄今为止最久经考验的 NLP 库。在某种程度上,它是当今 NLP 性能的黄金标准。在各种其他功能中,库中支持命名实体识别 (NER),这允许在一段文本中标记重要实体,如人名、地点等。

    示例代码:

    public void doTagging(CRFClassifier model, String input) {
      input = input.trim();
      System.out.println(input + "=>"  +  model.classifyToString(input));
    }  
    

    详细的博客以及如何使用它的完整代码:

    https://dataturks.com/blog/stanford-core-nlp-ner-training-java-example.php?s=so

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2011-06-12
      相关资源
      最近更新 更多