Сохранение переносимых слов в анализе ngrams с помощью tidytext - PullRequest
2 голосов
/ 08 октября 2019

Я занимаюсь текстовым анализом биограмм. Я хочу сохранить "сложные" слова, состоящие из множества "простых" слов, связанных дефисами. Например,

, если у меня есть следующий вектор:

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

*** Я редактировал этораздел, чтобы сделать мой вывод мне более понятным ****

Я хочу, чтобы мои биограммы были в формате data.frames 3x1 (это формат, который вы получаете при использовании unnest_tokens из tidytext:


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)

Как можноЯ делаю обе вещи одновременно?

спасибо

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Это правда, что по умолчанию удаляет большинство знаков препинания, но не подчеркивает подчеркивание:

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

Создано в 2019-11-01 представьте пакет (v0.3.0)

Иногда я использую этот подход для многословных токенов, или, если вы хотите проанализировать пунктуацию вместе со словами, проверьте параметр strip_punct = FALSE, которыйимеется.

1 голос
/ 08 октября 2019

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

только квантида 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"

Tidy data.frame:

tidytext имеет функцию tidy для преобразования данных из различных пакетов в аккуратную форму. Оба квантеда и тм включены. Таким образом, после получения данных в dfm вы можете использовать tidy, чтобы поместить данные в таблицу. После этого удалите все интересующие вас столбцы с обычным синтаксисом 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

конец редактирования:

с тм:

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
...