2013-02-13 22 views
6

tm kitaplığında bunun için önceden oluşturulmuş bir işlev var mı, yoksa güzel bir şekilde mi çalıyor?Rm t'si paketi ile okunabilirlik nasıl hesaplanır

Bulunduğum korpus, tm yüklenir şöyle gibi bir şey:

Ben koRpus kullanarak çalıştı
s1 <- "This is a long, informative document with real words and sentence structure: introduction to teaching third-graders to read. Vocabulary is key, as is a good book. Excellent authors can be hard to find." 
s2 <- "This is a short jibberish lorem ipsum document. Selling anything to strangers and get money! Woody equal ask saw sir weeks aware decay. Entrance prospect removing we packages strictly is no smallest he. For hopes may chief get hours day rooms. Oh no turned behind polite piqued enough at. " 
stuff <- rbind(s1,s2) 
d <- Corpus(VectorSource(stuff[,1])) 

ama ben zaten kullanıyorum farklı bir pakette retokenize saçma görünüyor. Dönüş nesnesini, sonuçları tm'a yeniden dahil etmeme izin verecek şekilde vektörleştirerek sorunlarım da vardı. (Yani, hatalardan dolayı, genellikle koleksiyonumdaki belge sayısından daha fazla veya daha az okunabilirlik puanları döndürürdü.)

Anlamak, hece olarak sesli harfleri ayrıştırmak için bir naif hesaplama yapabilirdim, ancak daha kapsamlı bir paket istiyor kenar durumlarını zaten ele alır (adres sessiz e'ler, vs.).

Seçebileceğiniz okunabilirlik puanlarım Flesch-Kincaid veya Fry'dır.

d 100 belgelerinin benim korpus nerede olduğunu başlangıçta çalıştı Ne:

f <- function(x) tokenize(x, format="obj", lang='en') 
g <- function(x) flesch.kincaid(x) 
x <- foreach(i=1:length(d), .combine='c',.errorhandling='remove') %do% g(f(d[[i]])) 

Maalesef x 100'den az dokümanları döndürür, bu yüzden doğru belgeyle başarıları ilişkilendiremiyoruz. (Bu kısmen “foreach” ile “for lapply” kelimesinin yanlış anlamında R '' lapply 'dir, ama ben bir metin nesnesinin yapısını yeterince zorlaştırdığım, flesch.kincaid'i uygulayamayacağımı ve hataları makul bir sırayla başarılı bir şekilde kontrol edebildiğimi buldum. ifadeleri.)

GÜNCELLEME ben denedim

iki başka şeyler, tm nesnesine Korpus fonksiyonlarını uygulamak için çalışıyor ... tm_map nesnesine

  1. Geçiş argümanlar kullanılarak varsayılan jeton: tm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize)

  2. bu geçiş, bir dizgeciklerini tanımlama bu döndürülen bir

    f <- function(x) tokenize(x, format="obj", lang='en') 
    tm_map(d,flesch.kincaid,force.lang="en",tagger=f) 
    

Hem.

Error: Specified file cannot be found: 

Ardından [ 1] d tam metni listeler. Onu buldu mu? Fonksiyonu doğru bir şekilde iletmek için ne yapmalıyım?

Bu garip bir hata gibi görünüyor
> lapply(d,tokenize,lang="en") 
Error: Unable to locate 
Introduction to teaching third-graders to read. Vocabulary is key, as is a good book. Excellent authors can be hard to find. 

--- Neredeyse sanmıyorum: Ben lapply doğrudan Korpus fonksiyonlarını harita çalıştığınızda İşte GÜNCELLEME 2

alıyorum hata var metnin yerini bulamadığı anlamına gelir, ancak bulunan metni dökmeden önce bazı boş hata kodlarını ('tokenizer' gibi) bulamaz.koRpus kullanılarak yeniden etiketleme ile

UPDATE 3

bir başka problem (tm konu etiketlerinin karşı) yeniden etiketleme standart çıktıya dizgeciklere ilerleme son derece yavaş ve çıkış oldu. Burada

f <- function(x) capture.output(tokenize(x, format="obj", lang='en'),file=NULL) 
g <- function(x) flesch.kincaid(x) 
x <- foreach(i=1:length(d), .combine='c',.errorhandling='pass') %do% g(f(d[[i]])) 
y <- unlist(sapply(x,slot,"Flesch.Kincaid")["age",]) 

Niyetim meta verileri meta(d, "F-KScore") <- y olarak benim tm(d) korpusuna arka üstünde y nesneyi yeniden bağlamanız olacaktır: Neyse, şu denedim.

Error in FUN(X[[1L]], ...) : 
    cannot get a slot ("Flesch.Kincaid") from an object of type "character" 

benim gerçek külliyatın bir öğesi, bir NA, ya da çok uzun, başka yasaklayıcı bir şey olmalı bence --- ve:

Maalesef benim gerçek veri setine uygulanan, şu hata mesajını alıyorum Yuvalanmış işlevselleştirmeye bağlı olarak, tam olarak nerede olduğunu izlemekte sorun yaşıyorum.

Yani, şu anda, tm kitaplığı ile güzelce oynayan puanları okumak için önceden oluşturulmuş bir işlev yok gibi görünüyor. Birisi kolay bir hata yakalama çözümü görmedikçe, görünüşte hatalı, hatalı biçimlendirilmiş belgelerin bazılarının belirtilememesiyle uğraşmak için işlev çağrılarımda sandviç yapabilir miyim?

+0

Eğer tm gelen 'tm_map' ile Korpus gelen' flesh.kincaid' kullanamaz mıyız? –

+0

Göremiyorum. "Hata: Dil belirtilmedi!" Yazıyor. tm_map (dd, flesch.kincaid) 'in her varyasyonu için, tm_map (dd, flesch.kincaid, "en") vb. gibi düşünebilirim. – Mittenchops

+0

Başka bir SO sorusuna danıştım (http:/İç içe geçmiş işlevlere argümanların nasıl iletileceği hakkında /stackoverflow.com/questions/6827299/r-apply-function-with-multiple-parameters). Bunu denedim tm_map (d, flesch.kincaid, force.lang = "en", tagger = tokenize) 'ancak" belirtilen dosyayı "bulamadığı bir hatayı al, sonra da belge 1'in içeriğini çıkarıyor. – Mittenchops

cevap

4

koRpus işlevleri corpus nesnesiyle ilgilenemediği için bir hatayla karşılaşırsınız. kRp.tagged nesnesini oluşturmak ve daha sonra tüm koRpus özelliklerini uygulamak daha iyidir. Burada, tm paketinin ovid verilerini kullanarak nasıl yaptığımı göstereceğim.

Kaynak dosya listemi almak için list.files kullanıyorum. Sadece kaynak metin dosyalarınıza doğru yolu vermeniz gerekiyor.

ll.files <- list.files(path = system.file("texts", "txt", 
            package = "tm"), 
       full.names=T) 

Sonra kRp.tagged nesne koRpus paketi ile verilen varsayılan bir tagger tokenize kullanarak bir listesini oluşturmak (O TreeTagger kullanmak önerilir ama bunu yüklemeniz gerekir edilir) Bir kez

ll.tagged <- lapply(ll.files, tokenize, lang="en") ## tm_map is just a wrapper of `lapply` 

Okunabilir formülü uygulayabileceğim "etiketli" nesneler listem var. flesch.kincaidreadability bir sarıcı olduğundan, doğrudan ikinci geçerli olacaktır:

ll.readability <- lapply(ll.tagged,readability)   ## readability 
ll.freqanalysis <- lapply(ll.tagged,kRp.freq.analysis) ## Conduct a frequency analysis 
ll.hyphen <- lapply(ll.tagged,hyphen)     ## word hyphenation 

vb .... tüm bu S4 nesnenin bir listesini üretir.

lapply(lapply(ll.readability ,slot,'desc'),    ## I apply desc to get a list 
     '[',c('sentences','words','syllables'))[[1]] ## I subset to get some indexes 
[[1]] 
[[1]]$sentences 
[1] 10 

[[1]]$words 
[1] 90 

[[1]]$syllables 
all s1 s2 s3 s4 
196 25 32 25 8 

Örneğin, iki colums, kelime (tireli kelime) ve syll (hece sayısı) ile bir veri çerçevesini almak için yuvayı hyphen kullanabilirsiniz: desc yuvası bu listeye kolay erişim sağlar . Burada, lattice kullanarak, her belge için bir dotplot çizmek için tüm data.frames'ı bağlarım.

enter image description here

+0

güzel bir cevap ve yardımsever, ancak sahip olduğum biçim ovid metin dosyaları olduğu gibi yerel olarak depolanmıyorsa, ben hala belirtecin nasıl yapılacağını anlayamıyorum ve tm nesnelerine geri dönüyorum. Bu kitaplığı diğer analizler için kullandım, bu yüzden koRpus'a tamamen bu algo için geçiyor olsam bile, koRpus okunabilirlik puanlarını bu varlıklara geri getirmenin bir yoluna ihtiyacım var. – Mittenchops

+0

@Mittenchops teşekkürler! Tamam yerel olarak değil ama nerede olduklarını? Ne dersin? tm için not almaktan kastediyorsunuz .. Eğer puan belge ise tm nesnelerine meta gibi bir meta gibi yerleştirmek kolaydır (doc [i], 'scoree') < - Skor '... – agstudy

+0

Teşekkürler, @agstudy. Yukarıda bir güncelleme ekledim. Corpus'u üreten işlem, onu aldığım veri kaynağından çok daha karmaşıktır, ancak böyle bir formatta gitmem gerekecek. Yukarıdaki en eski çözümümün önlenmesiyle ilgili sorun, boş dize belgeleri varsa, okuma düzeyi puanlarının düştüğü ve doğru olarak tm eşleştiremediğimdir. Yukardaki d ile başlıyorum. – Mittenchops

3

library(lattice) 
ll.words.syl <- lapply(ll.hyphen,slot,'hyphen')  ## get the list of data.frame 
ll.words.syl <- lapply(seq_along(ll.words.syl),  ## add a column to distinguish docs 
     function(i)cbind(ll.words.syl[[i]],group=i)) 
dat.words.syl <- do.call(rbind,ll.words.syl) 
dotplot(word~syll|group,dat.words.syl, 
     scales=list(y=list(relation ='free'))) 
Ben Korpus paket tm paketi ile etkileşime girmez üzgünüm sorunsuz henüz. Aylardır iki nesne sınıfı arasında çeviri yapmanın yollarını düşünüyordum ama henüz tatmin edici olmayan bir çözüm buldum.Bunun için bir fikriniz varsa, benimle iletişime geçmekten çekinmeyin. Bununla birlikte, koherus tarafından üretilen okunabilirlik nesneleri için summary() yöntemine yönlendirmek istiyorum, bu da ilgili sonuçların yoğunlaştırılmış data.frame sonucunu döndürür. Oldukça karmaşık S4 nesneleri aracılığıyla alternatif taramadan erişilmesi daha olasıdır ;-) summary(x, flat=TRUE)'u da deneyebilirsiniz.

@agstudy: Güzel grafik :-) readability()'dan önce hyphen()'u çalıştırmanız gerekir, böylece "tire" argümanı ile sonuçları tekrar kullanabilirsiniz. Ya da daha sonra readability() sonuçlarının "tire" yuvasına erişebilirsiniz. Gerekirse otomatik olarak tireler ve sonuçları saklar. Bir sonraki adımlardan önce, hyphen() çıktısını değiştirmeniz gerektiğinde tire için bir el ile aramanın yapılması gerekir. Bu 0.05-1'i çok daha öncekinden daha hızlı ekleyebilirim.

+1

Yorumunuzu daha önce görmedim! Sanırım "koRpus" paketinin yazarı sizsiniz. 1! – agstudy

2

qdap version 1.1.0 itibariyle qdap tm paketi ile daha uyumlu olması için bir number of functions sahiptir. İşte size sunduğunuz aynı Corpus'u kullanarak probleminize yaklaşmanın bir yoludur (Fry'ın aslında bir grafik ölçüsü olduğunu ve qdap'ın bunu koruduğunu, ayrıca Corpus'unuzun ve rastgele örneklemenin Fry'ın örnekleminin Corpus'un hesaplaması için yeterince büyük olmadığını önerdiğini unutmayın. Fry en):

library(qdap) 
with(tm_corpus2df(d), flesch_kincaid(text, docs)) 

## docs word.count sentence.count syllable.count FK_grd.lvl FK_read.ease 
## 1 s1   33    1    54  16.6  34.904 
## 2 s2   49    1    75  21.6  27.610 

with(tm_corpus2df(d), fry(text, docs)) 

## To plot it 
qheat(with(tm_corpus2df(d), flesch_kincaid(text, docs)), values=TRUE, high="red") 

enter image description here

İlgili konular