构建一个词性标注器(POS标注器)

3

我需要在Java中构建一个POS标记器,并需要知道如何入手。是否有代码示例或其他资源可以帮助说明POS标记器的工作原理?


自然语言处理是一个尚未解决的难题。您应该开始查找已发布的涉及您问题的文章,选择几个建议的解决方案,实现它们并选择对您产生更好结果的那个方案。 - amit
嗯...你一定要从头开始构建自己的吗?因为如果不是,你可以使用Andrey提到的斯坦福大学的或者WColen提到的OpenNLP的。我更喜欢斯坦福的;它非常好用。如果你必须要构建一个,那听起来像是一个作业项目;否则真的没有理由自己动手(至少我想不出来lol)。 - dmn
创建一个POS标记器是一个巨大的任务。理想情况下,您会得到一个带注释的语料库,解析它,获取标记频率、可能性估计值,平滑数据,然后构建模型。该模型可以仅基于您现有的随机数据进行构建,使用类似于逻辑回归或HMM的东西,或者您可以使用具有特征和Maxent或感知器模型的监督干预,其中您依赖于特征。您还可以通过使用类似于Brille的基于规则的标记器来完全避免概率模型。 - Victor Stoddard
3个回答

6
试试Apache OpenNLP。它包含POS标记工具。你可以从这里下载预先制作好的英语模型。
文档提供了关于如何在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) {
    }
  }
}

实例化POS标注器

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);

请注意,POS标注器需要有标记的句子。Apache OpenNLP还提供了工具和模型来帮助完成这些任务。
如果您需要训练自己的模型,请参考文档

5
你可以查看现有的标注器实现。
例如,参考斯坦福大学Java中的POS标注器(由Kristina Toutanova编写),它在GNU通用公共许可证(v2或更高版本)下可用,源代码编写得很好,文档清晰:

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

关于标记的好书推荐:

Daniel Jurafsky和James H. Martin合著的《语音与语言处理》第二版。


我不确定斯坦福POS标注器是否是一个好的实现起点,因为它有复杂(且一次性)的概率模型。不过,Jurafsky&Martin是值得阅读的书籍。 - Fred Foo

2
有几种被广泛使用的POS/NER标注器。
OpenNLP Maxent POS标注器:使用Apache OpenNLP。
OpenNLP是来自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);
    }
}

如何使用OpenNLP POS标记器的详细博客:

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

基于Stanford CoreNLP的NER标记器:

Stanford CoreNLP是目前最经过实战检验的自然语言处理库。从某种意义上来说,它是当今自然语言处理性能的黄金标准。在各种其他功能之中,该库支持命名实体识别(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接