2016-08-13 5 views
1

Я хочу проанализировать большой (n = 500 000) корпус документов. Я использую quanteda в ожидании, что will be faster чем tm_map() от tm. Я хочу продолжить шаг за шагом, вместо автоматического использования с dfm(). У меня есть причины для этого: в одном случае я не хочу tokenize перед удалением стоп-слов, так как это приведет к множеству бесполезных bigrams, а в другом я должен предварительно обработать текст с помощью специфических для языка процедур.Создайте dfm шаг за шагом с помощью quanteda

Я хотел бы эту последовательность, чтобы быть реализован:
1) удалить знаки препинания и цифры
2) удалить стоп-слова (то есть до токенизации, чтобы избежать ненужных маркеров)
3) токенизировать использование юниграмм и биграммы
-) создать DFM

Моя попытка:

> library(quanteda) 
> packageVersion("quanteda") 
[1] ‘0.9.8’ 
> text <- ie2010Corpus$documents$texts 
> text.corpus <- quanteda:::corpus(text, docnames=rownames(ie2010Corpus$documents)) 

> class(text.corpus) 
[1] "corpus" "list" 

> stopw <- c("a","the", "all", "some") 
> TextNoStop <- removeFeatures(text.corpus, features = stopw) 
# Error in UseMethod("selectFeatures") : 
# no applicable method for 'selectFeatures' applied to an object of class "c('corpus', 'list')" 

# This is how I would theoretically continue: 
> token <- tokenize(TextNoStop, removePunct=TRUE, removeNumbers=TRUE) 
> token2 <- ngrams(token,c(1,2)) 

Bonus вопрос Как удалить разреженные токены в quanteda? (Т. Е эквивалент removeSparseTerms() в tm


UPDATE В свете @ ответ Кена, вот код, следовать шаг за шагом с quanteda:

library(quanteda) 
packageVersion("quanteda") 
[1] ‘0.9.8’ 

1) Удалить пользовательские пунктуация и цифры. Например. обратите внимание, что «\ п» в ie2010 корпус

text.corpus <- ie2010Corpus 
texts(text.corpus)[1]  # Use texts() to extrapolate text 
# 2010_BUDGET_01_Brian_Lenihan_FF 
# "When I presented the supplementary budget to this House last April, I said we 
# could work our way through this period of severe economic distress. Today, I 
# can report that notwithstanding the difficulties of the past eight months, we 
# are now on the road to economic recovery.\nIt is 

texts(text.corpus)[1] <- gsub("\\s"," ",text.corpus[1]) # remove all spaces (incl \n, \t, \r...) 
texts(text.corpus)[1] 
2010_BUDGET_01_Brian_Lenihan_FF 
# "When I presented the supplementary budget to this House last April, I said we 
# could work our way through this period of severe economic distress. Today, I 
# can report that notwithstanding the difficulties of the past eight months, we 
# are now on the road to economic recovery. It is of e 

Еще замечание по той причине, почему один может предпочесть предобработки. Мой нынешний корпус на итальянском языке, на котором есть статьи, связанные с словами с апострофом. Таким образом, прямой dfm() может привести к неточному токенизации. .: например

broken.tokens <- dfm(corpus(c("L'abile presidente Renzi. Un'abile mossa di Berlusconi"), removePunct=TRUE)) 

будет производить две отдельные маркеры для того же слова («un'abile» и «l'abile»), отсюда и необходимость дополнительной стадии с gsub() здесь.

2) В quanteda невозможно удалить стоп-слова прямо в тексте перед токенизацией. В моем предыдущем примере «l» и «un» должны быть удалены, чтобы не создавать вводящие в заблуждение биграммы. Это можно обработать в tm с tm_map(..., removeWords).

3) лексемизацию

token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2) 

4) Создание DFM:

dfm <- dfm(token) 

5) Удалить редкие функции

dfm <- trim(dfm, minCount = 5) 
+0

Чтобы завершить ответ, вы можете шаг за шагом перейти в 'quanteda' с помощью функции' text() ': – 000andy8484

ответ

4

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

Однако один из принципов проектирования quanteda заключается в том, что текст становится «функциями» в процессе токенизации. Если у вас есть набор токенированных функций, которые вы хотите исключить, вы должны сначала подделать свой текст, или вы не можете их исключить. В отличие от других текстовых пакетов для R (например, tm), эти шаги применяются «вниз по течению» от корпуса, так что корпус остается необработанным набором текстов, к которым будут применяться манипуляции (но сам по себе не будет преобразованным набором тексты). Целью этого является сохранение общности, а также содействие воспроизводимости и прозрачности в анализе текста.

В ответ на вопросы:

  1. Однако вы можете переопределить наше поощряли поведение, используя функцию texts(myCorpus) <-, где то, что назначенная на тексты будут замещать существующие тексты. Таким образом, вы можете использовать регулярные выражения для удаления знаков препинания и чисел - например, команды stringi и использование классов Unicode для пунктуации и цифр для идентификации шаблонов.

  2. Прежде чем удалять стоп-слова, я рекомендую вам токенизировать. Остановить «слова» - это токены, поэтому нет способа удалить их из текста, прежде чем вы будете кратким текстом. Даже применение регулярных выражений для их замены для "" предполагает указание некоторой формы границы слова в регулярном выражении - опять же, это токенизация.

  3. Для tokenise в юниграммы и биграммы:

    маркеров (myCorpus, ngrams = 1: 2)

  4. Для создания DFM, просто вызовите dfm(myTokens). (Вы также могли бы применяться шаг 3, для ngrams, на данном этапе

Бонус 1:.. П = 2 коллокаций производит один и тот же список, как биграмм, за исключением того, в другом формате, который вы собираетесь что-то другое ли (? Самостоятельное SO вопрос возможно)

Бонус 2: Смотрите dfm_trim(x, sparsity =) в removeSparseTerms() варианты довольно запутанным для большинства людей, но это включало мигрантов из тм См this post для полного объяснения

BTW:... использование texts() вместо ie2010Corpus$documents$texts - мы скоро перепишем структуру объекта корпуса, поэтому вам не следует обращаться к его внутренностям таким образом, когда есть функция выделения. (Кроме того, этот шаг не нужен - здесь вы просто воссоздали корпус.)

Update 2018-01:

Новое имя для объекта мозолистого является data_corpus_irishbudget2010, а функция коллокации скоринг textstat_collocations().

+1

Большое спасибо @Ken. Я пропустил эту функцию 'text()'. – 000andy8484

+0

Добро пожаловать!Для нескольких версий «тексты <-' были отключены, но я понял, что многие люди найдут функциональность замены полезной. (Надеюсь, они будут использовать это ответственно!) –