我尝试使用netricate包从R内部使用Python的NLTK包。在很大程度上,我是成功的。在
现在,我想使用NLTK的ne_chunk()
函数执行命名实体识别(即,确定哪些标记表示命名实体以及它们表示的命名实体的类型)。我的问题是该函数返回一个类nltk.tree.Tree
的对象,我不知道如何在R中解析它
如果ne_chunk()
被输入到10个令牌标记对中,它将返回一个结果,该结果可以使用as.character()
转换为字符,该字符可以通过正则表达式函数进行解析(这只是一个黑客行为,我对此不满意)。但是,如果超过10对,它将返回树的一个简写表示,使用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)
以下是处理上一个示例中的文本时返回的速记:
^{pr2}$以下是ne_tagged_tokens
所属的类:
> class(ne_tagged_tokens)
[1] "nltk.tree.Tree" "python.builtin.list" "python.builtin.object"
我对使用替代的、预先存在的R包的建议不感兴趣。在
我想问题在于
reticulate
无法读取定制的Python对象,这是很常见的,因此您必须在R和Python接口之间传递与本机Python类型相同的Python对象。在有一种方法可以使用
Tree.pformat()
将ne_chunks
的输出格式更改为字符串(bracketed parse format):要读回它,请使用
^{pr2}$Tree.fromstring()
:所以我想在R中这样做可能会奏效:
但是将字符串读回R对象应该是不可能的,因为它不能处理非本机Python树对象,}一起工作,因为它不是一个函数。在
some_func <- function(...{nltk$some_func(...)})
不能与{如果要将
ne_chunk
树对象的输出操作到命名实体的列表中,那么您必须在Python中执行如下操作:NLTK Named Entity recognition to a Python list再说一次,如果您在Python中需要太多的函数,而实际上并不想重新编码或使用其他R库,那么为什么不使用Python编写而不是坚持使用R呢
相关问题 更多 >
编程相关推荐