6

ライブラリには、これに対して事前に構築された関数がありtmますか、それともうまく機能する関数はありますか?

私の現在のコーパスは、次のように 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を使用してみましたが、既に使用しているパッケージとは別のパッケージで再トークン化するのはばかげているようです。また、結果を に再組み込みできるように、戻りオブジェクトをベクトル化する際にも問題がありました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 を適用できず、適用の合理的な順序でエラーを正常にチェックできないことがわかりました。声明。)

アップデート

私が試した他の2つのこと、koRpus関数をtmオブジェクトに適用しようとしています...

  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:

次に、d[ 1 ]の全文をリストします。見つかったような?関数を正しく渡すにはどうすればよいですか?

更新 2

koRpus 関数を 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. 

これは奇妙なエラーのように見えます---テキストが見つからないという意味ではないと思いますが、見つかったテキストをダンプする前に、空白のエラー コード (「tokenizer」など) が見つからないということです。 .

更新 3

を使用した再タグ付けのもう 1 つの問題koRpusは、(tm タガーと比較して) 再タグ付けが非常に遅く、トークン化の進行状況が stdout に出力されることでした。とにかく、私は次のことを試しました:

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

ここでの私の意図は、y上記のオブジェクトtm(d)をメタデータとしてコーパスに再バインドすることmeta(d, "F-KScore") <- yです.

残念ながら、実際のデータ セットに適用すると、次のエラー メッセージが表示されます。

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

私の実際のコーパスの 1 つの要素は、NA であるか、長すぎるか、その他の法外なものであるに違いないと思います。

tmそのため、現在、ライブラリとうまく連携するスコアを読み取るためのビルド済み関数はないようです。誰かがエラーをキャッチする簡単な解決策を見つけない限り、関数呼び出しに挟み込んで、明らかに間違っている、不正な形式のドキュメントをトークン化できないことに対処できますか?

4

3 に答える 3

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を使用してオブジェクトのリストを作成します(使用することをお勧めしますが、インストールする必要があります)tokenizekoRpusTreeTagger

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

「タグ付けされた」オブジェクトのリストを取得したら、それに読みやすさの式を適用できます。flesch.kincaidは のラッパーなのでreadability、後者を直接適用します。

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 オブジェクトのリストが生成されます。スロットを使用descすると、次のリストに簡単にアクセスできます。

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 

たとえば、スロットhyphenを使用して、単語 (ハイフンでつながれた単語) と syl (音節の数) の 2 つの列を持つデータ フレームを取得できます。ここでは、 を使用してlattice、すべての data.frames をバインドし、dotplotドキュメントごとに a をプロットします。

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

ここに画像の説明を入力

于 2013-02-16T08:07:54.553 に答える