【问题标题】:Add synonyms from qdap to a preexisting dataframe in R将 qdap 中的同义词添加到 R 中预先存在的数据框
【发布时间】:2018-04-01 04:59:26
【问题描述】:

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

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

【问题讨论】:

    标签: r text-mining qdap


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      这是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)
      

      【讨论】:

        【解决方案3】:

        我不确定您究竟想如何添加一个单词的所有同义词,因为当您运行 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))
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        相关资源
        最近更新 更多