我正在尝试使用 Reticulate 包从 R 中使用 Python 的 NLTK 包。在大多数情况下,我是成功的。
现在,我想使用 NLTK 的ne_chunk()
函数执行命名实体识别(即确定哪些标记代表命名实体以及它们代表什么类型的命名实体。)。我的问题是该函数返回一个类的对象nltk.tree.Tree
,我不知道如何在 R 中解析它。
如果ne_chunk()
最多输入十个标记-标签对,它将返回一个可以使用 转换为字符的结果,可以as.character()
通过正则表达式函数对其进行解析(这只是一个 hack,我对此并不满意)。然而,超过十对,它将返回树的简写表示,使用 R 方法无法从中提取任何有意义的数据。
这是一个最小可重现的示例:
library(reticulate)
nltk <- import("nltk")
sent_tokenize <- function(text, language = "english") {
nltk$tokenize$sent_tokenize(text, language)
}
word_tokenize <- function(text, language = "english", preserve_line = FALSE) {
nltk$tokenize$word_tokenize(text, language, preserve_line)
}
pos_tag <- function(tokens, tagset = NULL, language = "eng") {
nltk$pos_tag(tokens, tagset, language)
}
ne_chunk <- function(tagged_tokens, binary = FALSE) {
nltk$ne_chunk(tagged_tokens, binary)
}
text <- "Christopher is having a difficult time parsing NLTK Trees in R."
tokens <- word_tokenize(text)
tagged_tokens <- pos_tag(tokens)
ne_tagged_tokens <- ne_chunk(tagged_tokens)
这是处理上一个示例中的文本时返回的简写:
> ne_tagged_tokens
List (11 items)
以下是ne_tagged_tokens
所属的类:
> class(ne_tagged_tokens)
[1] "nltk.tree.Tree" "python.builtin.list" "python.builtin.object"
我对使用替代的、预先存在的 R 包的建议不感兴趣。