OpenNLP Tokenizer是否无法检测到属于同一词?

时间:2018-07-11 20:18:59

标签: java nlp tokenize opennlp

我是NLP的新手,我遇到过OpenNLP。根据我的理解,tokenization意味着将文本分成单词和句子。单词通常用空格隔开,但并非所有空格都相等。例如,洛杉矶的个人想法与空白无关。但是,每当我运行OpenNLP令牌生成器时,它都会为洛杉矶创建两个不同的令牌:丢失天使。这是我的代码(我从旧的OpenNLP网站获得了模型en-token.bin。)

InputStream inputStream = new FileInputStream("C:\\apache-opennlp-1.9.0\\Models\\en-token.bin"); 
TokenizerModel tokenModel = new TokenizerModel(inputStream);
//Instantiating the TokenizerME class 
TokenizerME tokenizer = new TokenizerME(tokenModel);

String tokens[] = tokenizer.tokenize(sentence2);

for(String token : tokens) {
     System.out.println(token);
}

以下是输出:

The
city
of
Los
Angeles
is
one
of
the
most
beautiful
places
in
California

我在线测试了其他一些令牌生成器,它们产生相同的输出。如果不是标记化,那么识别这两个单词属于一起的过程将如何?

3 个答案:

答案 0 :(得分:0)

在线展示的基本单词分词器通常通过查看空格将句子分成单词。为了解决物理意义上的单词(例如洛杉矶或新德里等)不应该拆分的情况,我们可以自己编写一个函数,在拆分单词后,查找某种包含以下单词的字典:具有物理意义,并尝试将这些单词组合成一个组。

答案 1 :(得分:0)

opennlp提供了“ TokenizerTrainer”工具来训练数据。 OpenNLP格式每行包含一个句子。您还可以指定用空格或特殊标记分隔的标记。

您可以关注this博客,以出于各种目的在opennlp中抢先一步。文章将向您展示如何创建训练文件和建立新模型。

您可以使用modelbuilder addon轻松创建自己的训练数据集,并按照此处提到的一些规则进行训练以创建良好的NER model

您可以使用Modelbuilder插件here找到一些帮助。

基本上,您将所有信息都放在一个文本文件中,而NER实体则放在另一个文件中。插件会搜索特定的实体并将其替换为所需的标签。因此产生标记的数据。使用这个工具一定很容易!

此外,请遵循mr. markg's的答案以了解如何自行创建新模型。这将帮助您构建自己的模型,这些模型可以针对您的应用程序进行定制。

希望这会有所帮助!

答案 2 :(得分:-1)

您已经注意到,英语标记器基本上总是将空格视为分隔词。您可能有一个智能的令牌生成器,用于检查是否应分割一个位点,但是通常在NLP管道中(对于使用空格的语言),令牌生成器尽可能地简单。将已分离的单词连接在一起将是标记化之后的一个单独步骤。

查找需要连接的单词,例如“洛杉矶”,通常称为短语检测并置检测。这些短语本身在学术写作中通常被称为多词表达。 OpenNLP似乎没有任何与MWE相关的功能,但是Gensim具有易于使用的phrases功能,它们链接到其实现所基于的论文。斯坦福大学的CoreNLP也有library来完成任务。