使用 tidytext 在 ngrams 分析中保留带连字符的单词

Preserve Hyphenated words in ngrams analysis with tidytext

我正在对传记进行文本分析。我想保留 "complex" 个由连字符链接的许多 "simple" 个单词组成的单词。

例如,如果我有以下向量:

Example<- c("bovine retention-of-placenta sulpha-trimethoprim mineral-vitamin-liquid-mixture)

***我编辑了这部分以使我需要的输出更清晰****

我希望我的传记格式为 data.frame,尺寸为 3x1(这是使用 tidytext 中的 unnest_tokens 时获得的格式:


1 bovine                   retention-of-placenta
2 retention-of-placenta    sulpha-trimethoprim
3 sulpha-trimethoprim      mineral-vitamin-liquid-mixture

**** 本期结束****

我的问题是,对于 tidytext,选项标记与 "ngrams"(我正在执行的那种分析)或 "regex"(我可能使用的命令)一起使用以这些连字符为条件)

这是我目前使用的代码:

spdiag_bigrams<-diagnostics%>%unnest_tokens(bigram, text, token = "ngrams", n = 2)

我怎样才能同时做这两件事?

谢谢

unnest_tokens 清除标点符号。这会删除复杂单词之间的连字符。

您可以为此使用 quanteda 或 tm,因为这些软件包在默认情况下不会删除标点符号。以下示例假设您有一个 data.frame 并且正在使用语料库。但是 quanteda 的 tokens 函数可以直接作用于文本列。

example <- c("bovine retention-of-placenta sulpha-trimethoprim mineral-vitamin-liquid-mixture")
diagnostics <- data.frame(text = example, stringsAsFactors = FALSE)

与量子:

library(quanteda)

qcorp <- corpus(diagnostics)

bigrams <- tokens_ngrams(tokens(qcorp), n = 2, concatenator = " ")
qdfm <- dfm(bigrams)
convert(qdfm, "data.frame")

  document bovine retention-of-placenta retention-of-placenta sulpha-trimethoprim sulpha-trimethoprim mineral-vitamin-liquid-mixture
1    text1                            1                                         1                                                  1

只是 quanteda 的 tokens_ngrams 使用示例向量:

tokens_ngrams(tokens(example), n = 2, concatenator = " ")
tokens from 1 document.
text1 :
[1] "bovine retention-of-placenta"                       "retention-of-placenta sulpha-trimethoprim"         
[3] "sulpha-trimethoprim mineral-vitamin-liquid-mixture"

编辑:

要获取术语的向量,您可以使用其他转换选项之一并使用 $vocab 获取术语。

convert(qdfm, "lda")$vocab
[1] "bovine retention-of-placenta"                       "retention-of-placenta sulpha-trimethoprim"         
[3] "sulpha-trimethoprim mineral-vitamin-liquid-mixture"

整洁 data.frame:

tidytext 有一个 tidy 功能,可以将不同包中的数据转换为整洁的形式。包括 quanteda 和 tm。所以在将数据放入 dfm 之后,您可以使用 tidy 将数据放入 tibble。之后,使用通常的 dplyr 语法删除您不感兴趣的所有列。

tidy(qdfm)

# A tibble: 3 x 3
  document term                                               count
  <chr>    <chr>                                              <dbl>
1 text1    bovine retention-of-placenta                           1
2 text1    retention-of-placenta sulpha-trimethoprim              1
3 text1    sulpha-trimethoprim mineral-vitamin-liquid-mixture     1

结束编辑:

与 tm:

library(tm)
NLPBigramTokenizer <- function(x) {
  unlist(lapply(ngrams(words(x), 2), paste, collapse = " "), use.names = FALSE)
}

corp <- VCorpus(VectorSource(example))

dtm <- DocumentTermMatrix(corp, control=list(tokenize = NLPBigramTokenizer))
inspect(dtm)

<<DocumentTermMatrix (documents: 1, terms: 3)>>
Non-/sparse entries: 3/0
Sparsity           : 0%
Maximal term length: 50
Weighting          : term frequency (tf)
Sample             :
    Terms
Docs bovine retention-of-placenta retention-of-placenta sulpha-trimethoprim sulpha-trimethoprim mineral-vitamin-liquid-mixture
   1                            1                                         1                                                  1

确实 默认去除大部分标点符号,但不去除下划线:

library(tidyverse) 
library(tidytext)

example <- c("bovine retention-of-placenta sulpha-trimethoprim mineral-vitamin-liquid-mixture")

tibble(text = example) %>% 
  mutate(text = str_replace_all(text, "-", "_")) %>%
  unnest_tokens(word, text)
#> # A tibble: 4 x 1
#>   word                          
#>   <chr>                         
#> 1 bovine                        
#> 2 retention_of_placenta         
#> 3 sulpha_trimethoprim           
#> 4 mineral_vitamin_liquid_mixture

reprex package (v0.3.0)

于 2019-11-01 创建

有时我对多词标记采用这种方法,或者如果您想分析标点符号和词,请查看可用的 strip_punct = FALSE 选项。