我们假设我的数据框看起来像这样:
bio_text <- c("Georg Aemilius, eigentlich Georg Oemler, andere Namensvariationen „Aemylius“ und „Emilius“ (* 25. Juni 1517 in Mansfeld; † 22. Mai 1569 in Stolberg (Harz))...", "Johannes Aepinus auch: Johann Hoeck, Huck, Hugk, Hoch oder Äpinus (* um 1499 in Ziesar; † 13. Mai 1553 in Hamburg) war ein deutscher evangelischer Theologe und Reformator.\nAepinus wurde als Sohn des Ratsherrn Hans Hoeck im brandenburgischen Ziesar 1499 geboren...")
doc_id <- c("1", "2")
url <- c("https://de.wikipedia.org/wiki/Georg_Aemilius", "https://de.wikipedia.org/wiki/Johannes_Aepinus")
name <- c("Aemilius, Georg", "Aepinus, Johannes")
place_of_birth <- c("Mansfeld", "Ziesar")
full_wikidata <- data.frame(bio_text, doc_id, url, name, place_of_birth)
我想用R中的cleanNLP包执行命名实体识别。因此,我初始化了tokenizer和spaCy后端,一切正常:
options(stringsAsFactors = FALSE)
library(cleanNLP)
cnlp_init_tokenizers()
require(reticulate)
cnlp_init_spacy("de")
wikidata <- full_wikidata[,c("doc_id", "bio_text")]
wikimeta <- full_wikidata[,c("url", "name", "place_of_birth")]
spacy_annotatedWikidata <- cleanNLP::cnlp_annotate(wikidata, as_strings = TRUE, meta = wikimeta)
我唯一的问题是元数据。当我像这样运行它时,我得到以下警告消息:在cleanNLP :: cnlp_annotate(full_wikidata,as_strings = TRUE,meta = wikimeta):与meta一起给出的数据帧输入;忽略后者。说实话,我没有在meta
中获得有关cnlp_annotate
的文档:“一个可绑定到文档表的可选数据框”。这意味着我应该提供一个包含元数据的数据框,对吧?!后来,我希望能够做到这样的事情,例如:过滤掉文档号中的所有人员实体。 3:
cnlp_get_entity(spacy_annotatedWikidata) %>%
filter(doc_id == 3, entity_type == "PER") %>%
count(entity)
因此,我必须找到一种访问元数据的方法。任何帮助将非常感谢!
答案 0 :(得分:1)
幸运的是,在此期间,我得到了一些帮助和建议,以进一步了解Github上cnlp_annotate
的方法代码:https://github.com/statsmaths/cleanNLP/blob/master/R/annotate.R
它说,如果输入本身不是数据帧而是文件路径,则只能传递元数据数据帧。因此,如果您确实希望传递数据帧,则第一行必须为doc_id
,第二行为text
,其余的行将自动视为元数据!因此,在我的示例中,只需要更改full_wikidata
中的顺序:
full_wikidata <- data.frame(doc_id, bio_text, url, name, place_of_birth)
像这样,它可以直接用作clnp_annotate
中的输入:
spacy_annotatedWikidata <- cleanNLP::cnlp_annotate(full_wikidata, as_strings = TRUE)