将qdap中的同义词添加到R中的预先存在的数据框中

时间:2018-04-01 04:59:26

标签: r text-mining qdap

我在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

是否有一种优雅的方式来获得这个。还有其他可用于此的词典。

3 个答案:

答案 0 :(得分:1)

一种方法是使用mapply并将每个单词一次传递给qdap::synonyms。 “同义词”的结果可以使用paste0函数与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)

答案 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))