Как токенизировать слова, которых нет в словаре в R?

Я работаю над набором данных, которые мне нужно токенизировать для обучения. Прежде чем выполнять токенизацию, я создал словарь, поэтому мне нужно извлечь те слова, которые присутствуют в словаре как таковые.

Мой текстовый файл приведен ниже:

t <- "In order to perform operations inside the abdomen, surgeons must make an incision large enough to offer adequate visibility, provide access to the abdominal organs and allow the use of hand-held surgical instruments.  These incisions may be placed in different parts of the abdominal wall.  Depending on the size of the patient and the type of operation, the incision may be 6 to 12 inches in length.  There is a significant amount of discomfort associated with these incisions that can prolong the time spent in the hospital after surgery and can limit how quickly a patient can resume normal daily activities.  Because traditional techniques have long been used and taught to generations of surgeons, they are widely available and are considered the standard treatment to which newer techniques must be compared."

В мой словарь входят слова:

dict <- c("hand-held surgical instruments", "intensive care unit", "traditional techniques")

Теперь я применил токенизацию биграмм для слов в документе. Для этого я использовал следующий код:

#Preprocessing of data
corpus <- Corpus(VectorSource(t))
corpus <- tm_map(corpus,content_transformer(tolower))
corpus <- tm_map(corpus,removePunctuation)
corpus <- tm_map(corpus,PlainTextDocument)

#Bigram Tokenization
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
dtm <- TermDocumentMatrix(corpus,control=list(tokenize=BigramTokenizer, dictionary=dict))

Но я получаю вывод следующим образом:

<<TermDocumentMatrix (terms: 3, documents: 1)>>
Non-/sparse entries: 1/2
Sparsity           : 67%
Maximal term length: 30
Weighting          : term frequency (tf)

                            Docs
Terms                            character(0)
hand-held surgical instruments            0
intensive care unit                       0
traditional techniques                    1

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


person Athira    schedule 09.09.2015    source источник


Ответы (1)


Вам нужно проверить, что делает словарь. Он возвращает только слова из словаря.

словарь: вектор символов, по которому будет табулироваться. Другие термины не будут перечислены в результатах. По умолчанию NULL, что означает, что перечислены все термины в документе.

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

EDIT: на основе комментария

#Preprocessing of data
corpus <- Corpus(VectorSource(t))
corpus <- tm_map(corpus,content_transformer(tolower))
corpus <- tm_map(corpus,PlainTextDocument)

#Tokenizers
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3))

# dictionary bigrams removed.
tdm_bigram_no_dict <- TermDocumentMatrix(corpus,control=list(stopwords = BigramTokenizer(dict), tokenize = BigramTokenizer))
# dictionary bigrams from corpus
tdm_bigram_dict <- TermDocumentMatrix(corpus,control=list(tokenize = BigramTokenizer, dictionary = dict))
inspect(tdm_bigram_dict)

<<TermDocumentMatrix (terms: 3, documents: 1)>>
Non-/sparse entries: 1/2
Sparsity           : 67%
Maximal term length: 30
Weighting          : term frequency (tf)

                                Docs
Terms                            character(0)
  hand-held surgical instruments            0
  intensive care unit                       0
  traditional techniques                    1

# dictionary trigrams from corpus
tdm_trigram_dict <- TermDocumentMatrix(corpus,control=list(tokenize = TrigramTokenizer, dictionary = dict))
inspect(tdm_trigram_dict)

<<TermDocumentMatrix (terms: 3, documents: 1)>>
Non-/sparse entries: 1/2
Sparsity           : 67%
Maximal term length: 30
Weighting          : term frequency (tf)

                                Docs
Terms                            character(0)
  hand-held surgical instruments            1
  intensive care unit                       0
  traditional techniques                    0

# combine term document matrices into one. you can use rbind since tdm's are sparse matrices. If you want extra speed, look into the slam package.
tdm_total <- rbind(tdm_bigram_no_dict, tdm_bigram_dict, tdm_trigram_dict)

Поскольку там, где используется rowbind, там будут двойные записи на основе результатов словаря. Но работая дальше с данными, вы можете преобразовать их в фрейм данных и использовать dplyr, чтобы сгруппировать их в одну строку:

library(dplyr)    
df <- data.frame(terms = rownames(as.matrix(tdm_total)),   freq = rowSums(as.matrix(tdm_total)), row.names = NULL, stringsAsFactors = FALSE)
df <- df %>% group_by(terms) %>% summarise(sum(freq))
person phiver    schedule 09.09.2015
comment
Спасибо за попытку. Но мне нужны как словарные слова, так и токенизированные слова в качестве вывода - person Athira; 10.09.2015
comment
Это работает лучше!!!! Есть ли способ, которым слова словаря не нужно токенизировать. Например, я хочу, чтобы мой вывод выглядел так: - person Athira; 10.09.2015
comment
Это работает лучше!!!! Есть ли способ, которым слова словаря не нужно токенизировать. Например, я хочу, чтобы мои выходные данные выглядели так: (абдоминальные хирурги, органы брюшной полости, доступ, адекватная видимость, разрешение на использование, разрез, отделение интенсивной терапии, ручные хирургические инструменты). Здесь словарные слова получаются как таковые, в то время как другие слова в документе размечаются. - person Athira; 10.09.2015
comment
Словарь токенизируется один раз, ваш текст токенизируется 3 раза и 2 раза сопоставляется со словарем. Это не самый эффективный способ, если у вас огромный корпус. Поскольку вы хотите иметь полные строки словаря, вы сталкиваетесь с такими проблемами. По крайней мере, теперь вы получаете соответствие словаря и частоту термина. Как видите, отделение интенсивной терапии не фигурирует в этом тексте и не учитывается и не отображается в конечном результате. - person phiver; 10.09.2015
comment
Я согласен с этим. Но реанимационное отделение тоже должно присутствовать для дальнейшей обработки. Я работаю над большим корпусом, и я застрял в извлечении полных строк. - person Athira; 10.09.2015
comment
Немного изменен код, поэтому результаты словаря сохраняются, даже если они не отображаются в тексте. Тогда частота будет равна 0. - person phiver; 10.09.2015
comment
Я пробовал. Но я получаю эту ошибку: Ошибка: не удалось найти функцию %›% - person Athira; 10.09.2015