2013-02-13 32 views
6

tmライブラリにこれ用にあらかじめ構築された関数があるのか​​、それともうまくいくのでしょうか?tmパッケージでRの読みやすさを計算する方法

私の現在のコーパスは、TM、次のようにのようなものにロードされます:

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

私はkoRpusを使用してみましたが、私がすでに使用しているものとは別のパッケージに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機能を適用しようと...

  1. パス引数tm_mapオブジェクトに、使用してデフォルトトークナイザ: tm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize)

  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. 

は、これは奇妙なエラーのように見えます---私はほとんどないと思う:

UPDATE 2

は、ここで私はlapplyと直接koRpus機能をマップしようとしたとき、私は取得エラーですテキストが見つからないことを意味しますが、位置付けされたテキストをダンプする前に、空のエラーコード( 'tokenizer'など)を見つけることができません。

UPDATE 3

koRpusを用いて再タグ付けの別の問題は、(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、" en ")'などのように考えることができます。 – Mittenchops

+0

私は別のSOの質問(http:/ /引数をネストされた関数に渡す方法については、http://stackoverflow.com/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フィーチャを適用する方が良いでしょう。ここでは、データのtmパッケージを使用してこれを行う方法を示します。

私はlist.filesを使用してソースファイルのリストを取得しています。ソーステキストファイルに適切なパスを与えるだけです。

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

その後、私は一度

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

TreeTaggerを使用するrecommandedしかし、あなたはそれをインストールする必要があります)koRpusパッケージに与えられたデフォルトの鬼であるtokenizeを使用してkRp.taggedオブジェクトのリストを作成します私はそれに可読性の式を適用することができます "タグ付き"オブジェクトの私のリストがあります。 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オブジェクトのリストを生成します。あなたは、たとえば、2つのcolums、ワード(ハイフン付きの単語)とsyll(音節の数)とデータフレームを取得するためのスロットhyphenを使用することができます

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 

descスロットは、このリストに簡単にアクセスできます。ここではlatticeを使用して、すべてのdata.framesをバインドして、各ドキュメントのdotplotをプロットします。

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

enter image description here

+0

これは美しい答えと有用ですが、もし私が持っているフォーマットがovidテキストファイルのようにローカルに保存されていないなら、私はまだトークン化を行い、tmオブジェクトに戻す方法を理解していません。このライブラリを他の分析に使用していますので、koRpusに完全に切り替えていても、これらのエンティティにkoRpusの可読性スコアをキーイングする方法が必要です。 – Mittenchops

+0

@Mittenchopsありがとう!ローカルではありませんが、どこにいるのですか?スコアがドキュメントであれば、それはあなたのtmオブジェクトに 'meta(doc [i]、 'scoree')のような** meta **のように入れるのは簡単です。 - スコア '... – agstudy

+0

ありがとう、@agstudy。私は上記のアップデートを追加しました。コーパスを生成するプロセスは、データソースから得られる処理よりもはるかに複雑ですが、私はそれを取得していますが、そのような形式をとる必要があります。上記の私の初期の解決策を妨げている問題は、空文字列の文書があると、読書レベルのスコアだけで失われてしまい、正しくマップできないことです。上記の 'd'は私が始めているオブジェクトです。 – Mittenchops

3

私はkoRpusパッケージがスムーズにまだTMパッケージと相互作用しないごめんなさい。私は数ヶ月間、2つのオブジェクトクラスの間で翻訳する方法を考えてきましたが、まだ本当に満足できる解決策を思いついていません。あなたにこれについてのアイデアがあるなら、私に連絡するのをためらってください。

しかし、koRpusによって生成された可読性オブジェクトのsummary()メソッドを参照してください。このオブジェクトは、関連する結果が凝縮されたdata.frameを返します。これはおそらく、複雑なS4オブジェクトを介した代替クロールよりもアクセスがはるかに簡単です;-) summary(x, flat=TRUE)も試してみてください。

@agstudy:良いグラフ:-)時間を節約するには、readability()の前にhyphen()を実行する必要があります。その結果、「ハイフン」引数で結果を再利用できます。または、後でreadability()結果の「ハイフン」スロットにアクセスするだけで済みます。必要に応じて自動的にハイフネーションを行い、結果を保存します。ハイフンへの手動呼び出しは、次の手順の前にhyphen()の出力を変更する必要がある場合にのみ必要です。私は0.05-1がであることを、それ以前のものよりも速くであると付け加えることがあります。

+1

私は前にあなたのコメントを見たことがありません!私はあなたが 'koRpus'パッケージの作者だと思います。 +1! – agstudy

2

qdap version 1.1.0から、qdapは、012パッケージの方がより互換性があります。あなたが提供しているのと同じCorpusを使用して問題に近づける方法です(Fryはもともとグラフィカルメジャーであり、qdapはこれを保持しています;あなたのコーパスとランダムサンプリングでも、サンプルコーパスは計算するのに十分ではありません上のフライ年代):

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

関連する問題