2013-02-13 10 views
6

tm 라이브러리 또는 이와 관련하여 잘 작동하는 라이브러리가 미리 빌드되어 있습니까?tm 패키지로 R에서 가독성을 계산하는 방법

나의 현재 코퍼스는 TM에로드되어 다음과 같은 :

내가 koRpus를 사용하여 시도
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])) 

하지만 이미 사용하고 아닌 다른 패키지에 retokenize 바보 같다. 또한 결과를 tm으로 다시 포함시킬 수있는 방법으로 반환 객체를 벡터화하는 데 문제가있었습니다. 즉, 오류로 인해 컬렉션의 문서 수보다 가독성 점수가 더 많거나 적음을 알 수 있습니다.

나는 음절로 모음을 구문 분석하는 순진한 계산을 할 수 있지만 더 철저한 패키지를 원한다는 것을 이해합니다. 이미 엣지 경우를 처리합니다 (자동 e를 처리하는 등).

내 가독성 점수는 Flesch-Kincaid 또는 Fry입니다.

d는 (100 개) 문서 내 코퍼스 어디 원래 시도했다 무엇 :

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]])) 

불행하게도, x는 100 개 미만의 문서를 반환은, 그래서 올바른 문서와 성공을 연결할 수 없습니다. (부분적으로 R의 'foreach'와 'lapply'에 대한 나의 오해입니다. 그러나 텍스트 객체의 구조가 충분히 어렵 기 때문에 적절히 토큰화할 수없고 flesch.kincaid를 적용하고 합리적인 순서로 오류를 성공적으로 확인했습니다 문.)

UPDATE 내가 해봤

다른 두 가지의 TM 객체에 koRpus 기능을 적용하려고 ... tm_map 객체에

  1. 패스 인수를 사용하여 기본 토크 나이저 : ,

  2. 에서 그 전달 토크 나이 정의 이들 반품의

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

둘 다 :.

Error: Specified file cannot be found: 

후 [ 1] (D)의 전체 내용을 나열. 찾은 것 같아? 함수를 올바르게 전달하려면 어떻게해야합니까?

이 이상한 오류처럼 보이는
> 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. 

--- 나는 거의 생각하지 않는다 : 나는 lapply 직접 koRpus 기능을 매핑 할 때 다음 업데이트 2

은 내가 오류입니다 텍스트를 찾을 수 없다는 것을 의미하지만 위치가 지정된 텍스트를 덤프하기 전에 빈 텍스트 오류 코드 (예 : 'tokenizer')를 찾을 수 없습니다.koRpus를 사용하여 태그 재와

UPDATE 3

다른 문제점은 (TM에 술래 대) 태그를 다시 지정하는 표준 출력으로의 토큰의 진행이 매우 느리고 출력라는 것이었다. 여기

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",]) 

내 의도는 메타 데이터, meta(d, "F-KScore") <- y로 내 tm(d) 코퍼스 다시 위의 y 객체를 바인딩하는 것입니다 : 어쨌든, 나는 다음과 같은 시도했습니다.

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

가 내 실제 신체의 한 요소가 NA, 또는 너무 오래, 다른 금지 뭔가 생각합니다 ---과 :

불행하게도, 내 실제 데이터 집합에 적용, 나는 오류 메시지가 중첩 된 기능화로 인해 정확하게 추적하는 데 어려움을 겪고 있습니다.

따라서 현재는 tm 라이브러리로 훌륭하게 재생되는 점수를 읽기 위해 미리 작성된 함수가없는 것처럼 보입니다. 어떤 사람이 쉽게 실수를 포착 할 수있는 해결책을 발견하지 못한다면 필자의 함수 호출에 샌드위치를 ​​넣으면 분명히 잘못된, 잘못된 형식의 문서를 토큰화할 수 없다는 것을 처리 할 수 ​​있을까요?

+0

당신은 TM에서'tm_map'와 koRpus에서'flesh.kincaid'를 사용할 수 있습니까? –

+0

나는 할 수 없다. "오류 : 언어가 지정되지 않았습니다!"라고 표시됩니다. 'tm_map (dd, flesch.kincaid)의 모든 변형에 대해'tm_map (dd, flesch.kincaid, en ')'등등을 생각할 수 있습니다. – Mittenchops

+0

그래서 나는 다른 질문 (http : 중첩 된 함수에 인수를 전달하는 방법에 대한 자세한 내용은 /questions/6827299/r-apply-function-with-multiple-parameters를 참조하십시오. 나는이'tm_map (d, flesch.kincaid, force.lang = "en", tagger = tokenize)'을 시도했지만 "지정된 파일"을 찾을 수 없다는 오류를 얻은 다음, 문서 1의 내용을 출력합니다. – Mittenchops

답변

4

koRpus 함수는 corpus 개체를 처리 할 수 ​​없으므로 오류가 발생합니다. kRp.tagged 개체를 만든 다음 모든 koRpus 기능을 적용하는 것이 좋습니다. 여기 나는 ovid 데이터를 사용하여 tm 패키지의 데이터를 보여줍니다.

소스 파일 목록을 보려면 list.files을 사용합니다. 원본 텍스트 파일에 올바른 경로를 지정하기 만하면됩니다.

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

그럼 난 kRp.tagged 객체가 koRpus 패키지와 함께 주어진 기본 술래이다 tokenize를 사용하여 목록을 구성 (TreeTagger를 사용하는이 권유하지만 당신은 그것을 설치해야한다) 일단

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

을 나는 "태그가 붙은"객체 목록을 가지고 있습니다.이 태그는 가독성 공식을 적용 할 수 있습니다. flesch.kincaidreadability의 래퍼이기 때문에, 내가 직접 후자 적용됩니다

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 

등, ...이 모든 S4 객체의 목록을 생성합니다.

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 

당신은 예를 들어, 두 colums, 단어 (하이픈 단어)와 syll (음절의 수)로 데이터 프레임을 얻을 수있는 슬롯 hyphen을 사용할 수 있습니다 다음 desc 슬롯이 목록에 쉽게 액세스 할 수 있습니다 . 여기에서 lattice을 사용하여 모든 data.frames를 바인드하여 각 문서에 대해 dotplot을 플롯합니다.

enter image description here

+0

이것은입니다 아름다운 답변과 도움이되지만 ovid 텍스트 파일처럼 로컬 형식으로 저장되지 않으면 토큰 화를 수행하는 방법을 이해하지 못하고 tm 객체와 다시 연관시킵니다. 이 라이브러리를 다른 분석에 사용 했으므로 koRpus로 완전히 전환하는 경우에도 해당 엔티티로 koRpus 가독성 점수를 다시 입력해야합니다. – Mittenchops

+0

@Mittenchops 감사합니다! ok는 로컬이 아니지만 그들이 어디에 있습니까? socres를 tm으로 가져 오는 것은 무엇을 의미합니까? 점수가 문서에 의한 것이라면, 메타 오브젝트 (doc [i], scoree)와 같은 ** meta **로 그것을 넣는 것은 쉽습니다. - 점수'... – agstudy

+0

고마워, @ agstudy. 위의 업데이트를 추가했습니다. 코퍼스를 생성하는 프로세스는 데이터 소스의 프로세스보다 훨씬 복잡합니다.하지만 그와 같은 형식으로 이동해야합니다. 위의 초기 해결책을 방해하는 문제는 빈 문자열 문서가있는 경우 읽기 수준 점수만으로 점수가 떨어지고 tm에서 올바르게 반환 할 수 없다는 것입니다. 위의 'd'는 내가 시작하는 대상입니다. – 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'))) 
나는 koRpus 패키지는 TM 패키지와 상호 작용하지 않습니다 죄송 원활 아직. 저는 몇 달 동안 두 객체 클래스 사이를 변환하는 방법을 생각해 왔지만 아직 만족할만한 해결책을 찾지 못했습니다.이 아이디어가 있으시면 언제든지 저에게 연락하십시오.

그러나 관련 결과가 압축 된 data.frame을 반환하는 koRpus에 의해 생성 된 가독성 개체의 경우 메서드를 참조하겠습니다. 다소 복잡한 S4 객체를 통한 대안 크롤링보다 훨씬 쉽게 액세스 할 수 있습니다 ;-) summary(x, flat=TRUE)을 시도해보십시오.

@agstudy : 멋진 그래프 :-) 시간이 절약되도록 readability() 앞에 hyphen()을 실행해야하므로 "하이픈"인수를 사용하여 결과를 다시 사용할 수 있습니다. 또는 나중에 readability() 결과의 "하이픈"슬롯에 액세스 할 수 있습니다. 필요한 경우 자동으로 하이픈으로 연결되고 결과는 유지됩니다. 하이픈에 대한 수동 호출은 다음 단계 전에 hyphen()의 출력을 변경해야하는 경우에만 필요합니다. 나는 0.05-1이 인 것을 추가 할 수있다. 이것은 이전보다 더 빠른이다.

+1

나는 전에 귀하의 의견을 보지 못했습니다! 나는 당신이'koRpus' 꾸러미의 저자라고 생각합니다. +1! – agstudy

2

qdap version 1.1.0부터 qdap은 tm 패키지와 더 호환되도록 number of functions입니다. 여기에 Corpus을 사용하여 문제에 접근하는 방법입니다 (Fry는 원래 그래픽 측정 값이었고 qdap은 이것을 유지했으며 코퍼스와 무작위 샘플링 프라이는 샘플 Corpus가 계산할만큼 크지 않았다고 제안했습니다. 에 튀김의) :

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

관련 문제