1

我在 R 中创建了以下数据框 df

Sl 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

有没有一种优雅的方式来获得这个。有没有其他字典可以用来做这个。

4

3 回答 3

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)
于 2018-04-01T06:29:43.070 回答
1

一种方法是一次使用mapply每个单词并将其传递给qdap::synonyms. 'synonyms' 的结果可以使用paste0函数 with折叠在列中collapse = "|"。现在数据准备好了。用于tidyr::separate将列分隔为Syn1Syn2

注意: 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)
于 2018-04-01T06:18:16.017 回答
0

我不确定您究竟想如何添加一个单词的所有同义词,因为当您运行synonyms("get")它时,它会给出 75 个定义,get我觉得如果您在一行中添加 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))
于 2018-04-02T06:43:18.667 回答