我有一个包含文本数据的数据框架,其中一列包含感兴趣的文本&其他列是与此文本相关的元数据。
text metadata_1 metadata_2
x abc 123
y def 456
z ghi 789
对于单行,我有一个函数:
- 通过Google自然语言API通过googlelanguager包运行文本,该包返回一组具有各种NLP结果(实体,句子,令牌等)的列表
- 将返回的"实体"列表对象存储在数据帧中
- 将实体结果与分析文本的元数据相结合(因此每个实体有一行,并且元数据字段重复)
get_entities <- function(x) {
# run text through google nlp api with gl_nlp()
nlp_result <- x["text"] %>%
gl_nlp()
# store entities results in dataframe
entities <- as.data.frame(nlp_result[["entities"]])
# bind text info with entities into for the analyzed text
bind_cols(x, entities)
}
输出如下:
text metadata_1 metadata_2 entity entity_type
x abc 123 Joe PERSON
x abc 123 Chicago LOCATION
x abc 123 World Series EVENT
但是我想对文本数据集中的每一行执行相同的操作:分析文本字段,从get_nlp()列表输出中分离实体结果,并将这些结果连接回相应的文本元数据。然后,理想情况下,将单个结果合并到一个位置。
text metadata_1 metadata_2 entity entity_type
x abc 123 Joe PERSON
x abc 123 Chicago LOCATION
x abc 123 World Series EVENT
y def 456 2002 DATE
y def 456 New York LOCATION
z ghi 789 2016 DATE
我一直在寻找迭代我的数据集的最佳方法&把结果结合起来。是否有一种方法可以最有意义地将来自函数的数据集组合为for
循环或apply
的一部分?
我们可以使用rowwise
,将get_entities
应用于cur_data()
,将输出存储在list
和unnest
中list
输出
library(dplyr)
library(tidyr)
df1 %>%
rowwise %>%
summarise(out = list(get_entities(cur_data())), .groups = 'drop') %>%
unnest(c(out))
如果我们想在*apply
中这样做,循环遍历行序列,提取数据并应用get_entities
lapply(seq_len(nrow(df1)), function(i)
get_entities(df1[i,, drop = FALSE]))
您可以为每一行apply
函数get_entities
并合并结果。
result <- do.call(rbind, apply(df, 1, get_entities))