我在R
中创建了以下数据帧dfSl NO Word
1 get
2 Free
3 Joshi
4 Hello
5 New
我使用此代码获取同义词列表,但同样以列表的形式
library(qdap)
synonyms(DF$Word)
我正在为此获取一个同义词列表。我希望将数据框中每个单词的同义词作为单独的列以行方式附加到数据框中。
DF<-
Sl NO Word Syn1 Syn2
1 get obtain receive
2 Free independent NA
3 Joshi NA NA
4 Hello Greeting NA
5 New Unused Fresh
是否有一种优雅的方式来获得这个。还有其他可用于此的词典。
答案 0 :(得分:1)
一种方法是使用mapply
并将每个单词一次传递给qdap::synonyms
。 “同义词”的结果可以使用paste0
函数与collapse = "|"
合并到一列中。现在数据准备好了。
使用tidyr::separate
将列分为Syn1
,Syn2
等。
注意: synonyms
使用两个参数调用return.list = FALSE, multiwords = FALSE
以下代码限制了最大10
个同义词,但解决方案可以演变为动态处理数字。
library(tidyverse)
library(qdap)
df %>%
mutate(Synonyms =
mapply(function(x)paste0(
head(synonyms(x, return.list = FALSE, multiwords = FALSE),10), collapse = "|"),
tolower(.$Word))) %>%
separate(Synonyms, paste("Syn",1:10), sep = "\\|", extra = "drop" )
<强>结果:强>
# SlNO Word Syn 1 Syn 2 Syn 3 Syn 4 Syn 5 Syn 6 Syn 7 Syn 8 Syn 9 Syn 10
# 1 1 get achieve acquire attain bag bring earn fetch gain glean inherit
# 2 2 Free buckshee complimentary gratis gratuitous unpaid footloose independent liberated loose uncommitted
# 3 3 Joshi <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 4 4 Hello <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# 5 5 New advanced all-singing all-dancing contemporary current different fresh ground-breaking happening latest
数据强>
df <- read.table(text =
"SlNO Word
1 get
2 Free
3 Joshi
4 Hello
5 New",
header = TRUE, stringsAsFactors = FALSE)
答案 1 :(得分:1)
以下是splitstackshape::cSplit
的另一种方法。
library(tidyverse)
library(qdap)
library(splitstackshape)
DF <- read.table(text = tt, header = T)
DF <- DF %>% mutate_at(vars(Word), tolower)
syns <- synonyms_frame(synonyms(tolower(DF$Word))) %>%
mutate_at(vars(x), funs(str_remove(x, "\\..*"))) %>%
mutate_at(vars(y), funs(str_extract(y, '[:alpha:]+'))) %>%
group_by(x) %>%
summarise(Syn = toString(y)) %>%
rename(Word = x) %>% cSplit('Syn')
left_join(DF, syns)
答案 2 :(得分:0)
我不确定您希望如何添加单词的所有同义词,因为当您运行synonyms("get")
时,它会给出get
的75个定义,我觉得所需的布局不会太多如果您在一行中添加75个定义的所有值,请提供帮助。
所以在下面的解决方案中,我选择了非常第一个定义。
library(qdap)
library(dplyr)
library(splitstackshape)
df %>%
rowwise() %>%
mutate(synonym_of_word = paste(synonyms(tolower(word))[[1]], collapse=",")) %>%
cSplit("synonym_of_word", ",")
示例数据:
df <- structure(list(sl_no = 1:5, word = c("get", "Free", "Joshi",
"Hello", "New")), .Names = c("sl_no", "word"), class = "data.frame", row.names = c(NA,
-5L))