2013-10-27 2 views
11

Я начинаю с пакета tm в R, поэтому, пожалуйста, несите меня и извиняйтесь за большую стену текста. Я создал довольно большой корпус социалистической/коммунистической пропаганды и хотел бы извлечь недавно придуманные политические термины (несколько слов, например, «борьба-критика-трансформация»).Поиск ngrams в R и сравнение ngrams через тела

Это двухэтапный вопрос, касающийся моего кода, и один, касающийся того, как я должен продолжать.

Шаг 1: Для этого я хотел сначала определить некоторые распространенные ngrams. Но я застрял очень рано. Вот что я делаю:

library(tm) 
library(RWeka) 

a <-Corpus(DirSource("/mycorpora/1965"), readerControl = list(language="lat")) # that dir is full of txt files 
summary(a) 
a <- tm_map(a, removeNumbers) 
a <- tm_map(a, removePunctuation) 
a <- tm_map(a , stripWhitespace) 
a <- tm_map(a, tolower) 
a <- tm_map(a, removeWords, stopwords("english")) 
a <- tm_map(a, stemDocument, language = "english") 
# everything works fine so far, so I start playing around with what I have 
adtm <-DocumentTermMatrix(a) 
adtm <- removeSparseTerms(adtm, 0.75) 

inspect(adtm) 

findFreqTerms(adtm, lowfreq=10) # find terms with a frequency higher than 10 

findAssocs(adtm, "usa",.5) # just looking for some associations 
findAssocs(adtm, "china",.5) 

# ... and so on, and so forth, all of this works fine 

Корпус загружаю в R отлично с большинством функций я бросаю на него работает. У меня не было никаких проблем с созданием TDM из моего корпуса, поиска частых слов, ассоциаций, создания облаков слов и т. Д. Но когда я пытаюсь использовать идентифицировать ngrams, используя подход, изложенный в tm FAQ, я, видимо, делает какую-то ошибку с ТДМ-конструктор:

# Trigram 

TrigramTokenizer <- function(x) NGramTokenizer(x, 
           Weka_control(min = 3, max = 3)) 

tdm <- TermDocumentMatrix(a, control = list(tokenize = TrigramTokenizer)) 

inspect(tdm) 

я получаю сообщение об ошибке:

Error in rep(seq_along(x), sapply(tflist, length)) : 
invalid 'times' argument 
In addition: Warning message: 
In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL' 

Любой идеи? Является ли «а» не правильным классом/объектом? Я смущен. Я предполагаю, что здесь есть фундаментальная ошибка, но я этого не вижу. :(

Шаг 2: Тогда я хотел бы определить ngrams, которые значительно чаще, когда я сравниваю корпус против других корпусов Например, я мог бы сравнить мой корпус против большого стандартного английского корпуса или создать подмножества.. что я могу сравнивать друг с другом (например, советская и китайская коммунистическая терминология). У вас есть какие-то предложения о том, как я должен это делать? Любые скрипты/функции, которые я должен изучить? Просто некоторые идеи или указатели были бы замечательными.

Благодарим за ваше терпение

+0

У меня была такая же ошибка, для меня это сработало, когда я установил минимальное значение, отличное от max в управлении Weka ... Не знаю, если это вариант для вас .... – holzben

+0

Спасибо за ваш совет! Однако для меня это не работало. Сообщение об ошибке остается неизменным при изменении значений min/max. –

+6

На всякий случай люди когда-либо находят это или интересуются: я на самом деле не решил первую проблему, но мне удалось обойти ее, используя аналогичную функцию, предоставляемую пакетом ** RTextTools **: 'matrix <- create_matrix (corpus , ngramLength = 3) ' –

ответ

7

Я не мог воспроизвести вашу проблему, используете ли вы последние версии R, tm, RW эка и т. д.?

require(tm) 
a <- Corpus(DirSource("C:\\Downloads\\Only1965\\Only1965")) 
summary(a) 
a <- tm_map(a, removeNumbers) 
a <- tm_map(a, removePunctuation) 
a <- tm_map(a , stripWhitespace) 
a <- tm_map(a, tolower) 
a <- tm_map(a, removeWords, stopwords("english")) 
# a <- tm_map(a, stemDocument, language = "english") 
# I also got it to work with stemming, but it takes so long... 
adtm <-DocumentTermMatrix(a) 
adtm <- removeSparseTerms(adtm, 0.75) 

inspect(adtm) 

findFreqTerms(adtm, lowfreq=10) # find terms with a frequency higher than 10 
findAssocs(adtm, "usa",.5) # just looking for some associations 
findAssocs(adtm, "china",.5) 

# Trigrams 
require(RWeka) 
TrigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3)) 
tdm <- TermDocumentMatrix(a, control = list(tokenize = TrigramTokenizer)) 
tdm <- removeSparseTerms(tdm, 0.75) 
inspect(tdm[1:5,1:5]) 

И вот что я получаю

A term-document matrix (5 terms, 5 documents) 

Non-/sparse entries: 11/14 
Sparsity   : 56% 
Maximal term length: 28 
Weighting   : term frequency (tf) 

            Docs 
Terms        PR1965-01.txt PR1965-02.txt PR1965-03.txt 
    †chinese press        0    0    0 
    †renmin ribao        0    1    1 
    — renmin ribao        2    5    2 
    “ chinese people       0    0    0 
    “renmin ribaoâ€\u009d editorial    0    1    0 
    etc. 

Что касается вашего второго шага, вот некоторые указатели на полезные стартах:

http://quantifyingmemory.blogspot.com/2013/02/mapping-significant-textual-differences.html http://tedunderwood.com/2012/08/14/where-to-start-with-text-mining/ и вот его код https://dl.dropboxusercontent.com/u/4713959/Neuchatel/NassrProgram.R

+0

Еще раз спасибо, Бен. Я проверил свои версии R, RWeka и tm, и все, кажется, актуально. Эта ошибка, по-видимому, обсуждалась ранее (http://stackoverflow.com/questions/17703553/), и вы уже взвесили, что она может иметь какое-то отношение к установке Java. Я попытался запустить код на компьютере под управлением Windows, и все прошло гладко, поэтому я предполагаю, что это проблема. Что касается второго шага, сценарий Nassr от Ted Underwood, похоже, делает то, что я ищу, только со словами вместо ngrams. Я попытаюсь расшифровать его и узнать из него! Благодаря! –

+0

Не беспокойтесь. Да, Java ... все, что я помню, это то, что это источник многих разочарований! Рад слышать, что у вас есть несколько вариантов преодоления этого препятствия. Любопытно посмотреть, как проходит анализ излишней n-граммы, задайте еще один вопрос о том, когда у вас есть какой-то код. – Ben

+0

Это решило это для меня: 'options (mc.cores = 1)' – marbel

0

Дальше Ответ Бена - я тоже не мог воспроизвести это, но в прошлом у меня были проблемы с plyr pa ckage и конфликтующие зависимости. In my case был конфликт между Hmisc и ddply. Вы можете попробовать добавить эту строку непосредственно перед ошибочную строку кода:

tryCatch(detach("package:Hmisc"), error = function(e) NULL) 

Извинения, если это полностью tangental вашей проблемы!

2

Относительно Шаг 1, Брайан.Кенг дает обходное решение для одного лайнера здесь https://stackoverflow.com/a/20251039/3107920, которое решает эту проблему на Mac OSX - похоже, это связано с параллелизацией, а не (с небольшим кошмаром, который есть) java setup на mac.

1

Вы можете явно получить доступ к функциям, как этот

BigramTokenizer <- function(x) { 
    RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 3)) 
} 

myTdmBi.d <- TermDocumentMatrix(
    myCorpus.d, 
    control = list(tokenize = BigramTokenizer, weighting = weightTfIdf) 
) 

Кроме того, некоторые другие вещи, которые случайно придумали.

myCorpus.d <- tm_map(myCorpus.d, tolower) # This does not work anymore 

Тест вместо

myCorpus.d <- tm_map(myCorpus.d, content_transformer(tolower)) # Make lowercase 

В пакете RTextTools,

create_matrix (as.vector (С $ V2), ngramLength = 3) # ngramLength выбрасывает сообщение об ошибке.

Смежные вопросы