Czy jest do tego gotowa funkcja w bibliotece tm
, lub taka, która z nią ładnie gra?Jak obliczyć czytelność w R z pakietem tm
Mój obecny corpus jest ładowany do tm, coś w następujący sposób:
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]))
Próbowałem za pomocą koRpus, ale wydaje się głupie retokenize w innym opakowaniu niż ten już używam. Miałem także problemy z wektoryzowaniem obiektu zwracanego w sposób, który pozwoliłby mi ponownie wprowadzić wyniki do tm
. (Mianowicie, z powodu błędów, często zwracał więcej lub mniej wyników czytelności niż liczba dokumentów w mojej kolekcji).
Rozumiem, że mogłem wykonać naiwne obliczenie analizujące samogłoski jako sylaby, ale chcę bardziej dokładnego pakietu, który zajmuje się już sprawami krawędziowymi (adres cichy, itp.).
Moje wyniki czytelności z wyboru to Flesch-Kincaid lub Fry.
Co Próbowałem pierwotnie gdzie d jest mój korpus 100 dokumentów:
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]]))
Niestety x zwraca mniej niż 100 dokumentów, więc nie mogę skojarzyć sukcesy z odpowiednim dokumentem. (Jest to częściowo moje niezrozumienie "foreach" versus "lapply" w R, ale uznałem strukturę obiektu tekstowego za wystarczająco trudną, że nie mogłem się odpowiednio tokenizować, zastosować flesch.kincaid i skutecznie sprawdzać błędy w rozsądnej kolejności oświadczenia.)
UPDATE
Dwie inne rzeczy próbowałem, próbując zastosować funkcje KORPUS do obiektu tm ...
przekazywać argumenty do obiektu tm_map, używając domyślny tokenizer:
tm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize)
Zdefiniuj tokenizera, które przechodzą w
f <- function(x) tokenize(x, format="obj", lang='en') tm_map(d,flesch.kincaid,force.lang="en",tagger=f)
Obie te zwrócone.
Error: Specified file cannot be found:
Następnie wymienia pełny tekst d [1]. Wydaje się, że to znalazłeś? Co powinienem zrobić, aby poprawnie przekazać funkcję?
UPDATE 2
Tutaj jest błąd pojawia się, gdy próbuję mapować funkcje KORPUS bezpośrednio z lapply:
> 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.
To wygląda dziwnie błędu --- ja prawie nie sądzę oznacza to, że nie może zlokalizować tekstu, ale nie może znaleźć pustego kodu błędu (takiego jak "tokenizer"), zanim opuści umieszczony tekst.
UPDATE 3
Innym problemem zmieniać tagów pomocą koRpus
zmieniać tagów, że (w przeciwieństwie do nadawania oznaczeń tm) był bardzo powolny, a jego wyjście atomizacja postęp na standardowe. Zresztą próbowałem następujące:
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",])
Moim zamiarem tutaj byłoby ponownie powiązać obiekt y
nad powrotem do mojego tm(d)
corpus jako metadane, meta(d, "F-KScore") <- y
.
Niestety, zastosowane do mojego aktualnego zestawu danych, pojawia się komunikat o błędzie:
Error in FUN(X[[1L]], ...) :
cannot get a slot ("Flesch.Kincaid") from an object of type "character"
Myślę, że jednym z elementów mojego rzeczywistego corpus musi być NA, ani zbyt długi, coś innego i wygórowane --- z powodu zagnieżdżonej funkcjonalizacji, mam problem ze śledzeniem dokładnie, która jest.
Obecnie wygląda na to, że nie ma gotowej funkcji do odczytu wyników, które dobrze pasują do biblioteki tm
. Dopóki ktoś nie zobaczy łatwego rozwiązania powodującego błąd, mógłbym połączyć się z moimi wezwaniami, by poradzić sobie z niezdolnością do tokenu niektórych pozornie błędnych, zniekształconych dokumentów?
nie można użyć 'flesh.kincaid' od Korpus z' tm_map' z tm? –
Nie mogę. Mówi "Błąd: nie podano żadnego języka!" dla każdej odmiany 'tm_map (dd, flesch.kincaid)' ja mogę myśleć, takich jak 'tm_map (dd, flesch.kincaid," en ")', itp. – Mittenchops
Więc, skonsultowałem się z innym pytaniem SO (http://stackoverflow.com/questions/6827299/r-apply-function-with-multiple-parameters) o przekazywaniu argumentów do zagnieżdżonych funkcji. Próbowałem tego 'tm_map (d, flesch.kincaid, force.lang =" en ", tagger = tokenize)' ale dostaję błąd, że nie może znaleźć "określonego pliku", a następnie wyprowadza zawartość dokumentu 1. – Mittenchops