Анализ текста с использованием пользовательских ключевых слов в R

Я пытаюсь векторизовать свои текстовые данные, используя пакет R tm.

Сейчас мой корпус данных имеет следующий вид:

1. The sports team practiced today
2. The soccer team went took the day off

тогда данные будут векторизованы в:

<the, sports, team, practiced, today, soccer, went, took, off>
1.  <1, 1, 1, 1, 1, 0, 0, 0, 0>
2.  <1, 0, 1, 0, 0, 1, 1, 1, 1>

Я бы предпочел использовать группу пользовательских фраз для своего вектора, например:

<sports team, soccer team, practiced today, day off>
1. <1, 0, 1, 0>
2. <0, 1, 0, 1>

Есть ли пакет или функция в R, которая сделает это? Или есть другие ресурсы с открытым исходным кодом, которые имеют аналогичную функциональность? Спасибо.


person dortiz    schedule 09.04.2015    source источник


Ответы (2)


Вы спрашивали о других текстовых пакетах, я приглашаю вас попробовать quanteda, который я разработал с Полом Налти.

В приведенном ниже коде сначала вы определяете нужные фразы из нескольких слов в виде именованного списка, который набирается как объект класса «словарь» Quanteda с помощью конструктора dictionary(), а затем вы используете phrasetotoken() для преобразования фраз, найденных в ваших текстах, в отдельные «токены», состоящие из фразовых слов, объединенных символами подчеркивания. Токенизатор игнорировал символы подчеркивания, поэтому ваши фразы обрабатывались так, как если бы они были токенами, состоящими из одного слова.

dfm() является конструктором матриц функций документа, может принимать регулярные выражения, определяющие сохраняемые функции, здесь любая фраза, содержащая символ подчеркивания (регулярное выражение, конечно, можно было бы уточнить, но я намеренно оставил его здесь простым). dfm() имеет много вариантов -- см. ?dfm.

install.packages("quanteda")
library(quanteda)

mytext <- c("The sports team practiced today",
            "The soccer team went took the day off")
myphrases <- dictionary(list(myphrases=c("sports team", "soccer team", "practiced today", "day off")))
mytext2 <- phrasetotoken(mytext, myphrases)
mytext2
## [1] "The sports_team practiced_today"       "The soccer_team went took the day_off"
# keptFeatures is a regular expression: keep only phrases

mydfm <- dfm(mytext2, keptFeatures = "_", verbose=FALSE)
mydfm
## Document-feature matrix of: 2 documents, 4 features.
## 2 x 4 sparse Matrix of class "dfmSparse"
## features
## docs    day_off practiced_today soccer_team sports_team
## text1         0               1           0           1
## text2         1               0           1           0

Будем рады помочь с любыми вопросами, связанными с quanteda, включая запросы функций, если вы можете предложить улучшения в обработке фраз.

person Ken Benoit    schedule 31.05.2015

Как насчет чего-то подобного?

library(tm)

text <- c("The sports team practiced today", "The soccer team went took the day off")

corpus <- Corpus(VectorSource(text))

tokenizing.phrases <- c("sports team", "soccer team", "practiced today", "day off")  

phraseTokenizer <- function(x) {
  require(stringr)

  x <- as.character(x) # extract the plain text from the tm TextDocument object
  x <- str_trim(x)
  if (is.na(x)) return("")
  phrase.hits <- str_detect(x, ignore.case(tokenizing.phrases))

  if (any(phrase.hits)) {
    # only split once on the first hit, so we don't have to worry about multiple occurences of the same phrase
    split.phrase <- tokenizing.phrases[which(phrase.hits)[1]] 
    # warning(paste("split phrase:", split.phrase))
    temp <- unlist(str_split(x, ignore.case(split.phrase), 2))
    out <- c(phraseTokenizer(temp[1]), split.phrase, phraseTokenizer(temp[2])) # this is recursive, since f() calls itself
  } else {
    out <- MC_tokenizer(x)
  }

  # get rid of any extraneous empty strings, which can happen if a phrase occurs just before a punctuation
  out[out != ""]
}


tdm <- TermDocumentMatrix(corpus, control = list(tokenize = phraseTokenizer))

> Terms(tdm)
[1] "day off"         "practiced today" "soccer team"     "sports team"     "the"             "took"           
[7] "went"
person lawyeR    schedule 09.04.2015
comment
Когда я перехожу к шагу.....tdm ‹- TermDocumentMatrix(docs, control = list(tokenize = фразаTokenizer))... я получаю следующий код ошибки....Ошибка в check_pattern(шаблон, строка): Длина строки и шаблона несовместимы Кроме того: Предупреждающее сообщение: В if (is.na(x)) return() : условие имеет длину › 1, и будет использоваться только первый элемент - person dortiz; 09.04.2015
comment
Пробежал нормально для меня. Я попробовал вызов без управляющего аргумента, и все было в порядке. › tdm2 ‹- TermDocumentMatrix(corpus) ›Terms(tdm2) [1] выходной тренировался футбол спортивная команда сегодня взял [10] пошел - person lawyeR; 10.04.2015