Сохранить ID документа с R corpus

Я искал stackoverflow и в интернете и могу найти только частичные решения или некоторые, которые не работают из-за изменений в TM или qdap. Проблема ниже:

У меня есть фрейм данных:ID и текст (простой документ id / name а потом некоторые текст)

У меня есть два вопроса:

Часть 1: как я могу создать tdm или dtm и сохранить имя/id документа? Он показывает только "символ (0)" на проверить(ТДМ).
Часть 2: Я хочу сохранить только определенный список терминов, т. е. напротив удаления пользовательских стоп-слов. Я хочу, чтобы это произошло в корпусе, а не в tdm/dtm.

для части 2 я использовал решение, которое я получил здесь:как реализовать правила близости в словаре tm для подсчета слов?

Это происходит на части tdm! Есть ли лучшее решение для части 2, где вы используете что-то вроде "tm_map(my.туловище, keepOnlyWords, customlist)"?

любая помощь будет высоко оценили. Спасибо!

2 ответов


в более новых версиях tm это намного проще с функцией DataframeSource ().

" источник фрейма данных интерпретирует каждую строку фрейма данных x как документ. Первый столбец должен иметь имя "doc_id" и содержать уникальный строковый идентификатор для каждого документа. Второй столбец должен называться " текст "и содержать кодированную строку" UTF-8", представляющую содержимое документа. Необязательные дополнительные столбцы используются в качестве метаданных уровня документа."

Так в этом дело:

dd <-data.frame(
    doc_id=10:13,
    text=c("No wonder, then, that ever gathering volume from the mere transit ",
      "So that in many cases such a panic did he finally strike, that few ",
      "But there were still other and more vital practical influences at work",
      "Not even at the present day has the original prestige of the Sperm Whale")
    ,stringsAsFactors=F
 )

Corpus = VCorpus(DataframeSource(dd))

во-первых, вот пример данных.кадр

dd<-data.frame(
    id=10:13,
    text=c("No wonder, then, that ever gathering volume from the mere transit ",
      "So that in many cases such a panic did he finally strike, that few ",
      "But there were still other and more vital practical influences at work",
      "Not even at the present day has the original prestige of the Sperm Whale")
    ,stringsAsFactors=F
 )

теперь, чтобы прочитать специальные атрибуты из данных.кадр, мы будем использовать readTabular функция для того чтобы сделать наши собственные данные по таможни.считыватель кадров. Это все, что нам нужно

library(tm)
myReader <- readTabular(mapping=list(content="text", id="id"))

мы просто указываем столбец для использования для содержимого и идентификатора в данных.рамка. Теперь мы читаем его с DataframeSource но используйте наш пользовательский считыватель.

tm <- VCorpus(DataframeSource(dd), readerControl=list(reader=myReader))

теперь, если мы хотим сохранить только определенный набор слов, мы можем создать наши собственные!-Функция -8-->. Один из способов сделать это

keepOnlyWords<-content_transformer(function(x,words) {
    regmatches(x, 
        gregexpr(paste0("\b(",  paste(words,collapse="|"),"\b)"), x)
    , invert=T)<-" "
    x
})

это заменит все, что не находится в списке слов, пробелом. Обратите внимание, что после этого вы, вероятно, захотите запустить stripWhitespace. Таким образом, наши преобразования будут выглядеть как

keep<-c("wonder","then","that","the")

tm<-tm_map(tm, content_transformer(tolower))
tm<-tm_map(tm, keepOnlyWords, keep)
tm<-tm_map(tm, stripWhitespace)

и тогда мы можем превратить это в матрицу терминов документа

dtm<-DocumentTermMatrix(tm)
inspect(dtm)

# <<DocumentTermMatrix (documents: 4, terms: 4)>>
# Non-/sparse entries: 7/9
# Sparsity           : 56%
# Maximal term length: 6
# Weighting          : term frequency (tf)

#     Terms
# Docs that the then wonder
#   10    1   1    1      1
#   11    2   0    0      0
#   12    0   1    0      0
#   13    0   3    0      0

и вы можете это он имеет наш список слов и соответствующие идентификаторы документов из данных.кадр