3

大きな (n=500,000) ドキュメントのコーパスを分析したい。fromよりも高速になることをquanteda期待して 使用しています。で自動化された方法を使用する代わりに、段階的に進めたい。これには理由があります。ある場合には、ストップワードを削除する前にトークン化したくありません。これは、多くの役に立たないバイグラムが発生するためです。別の場合には、言語固有の手順でテキストを前処理する必要があります。tm_map()tmdfm()

このシーケンスを実装してほしい:
1) 句読点と数字を
削除する 2) ストップワードを削除する (つまり、無駄なトークンを避けるためにトークン化する前に)
3) ユニグラムとバイグラムを使用してトークン化する
4) dfm を作成する

私の試み:

> library(quanteda)
> packageVersion("quanteda")
[1] ‘0.9.8’
> text <- ie2010Corpus$documents$texts
> text.corpus <- quanteda:::corpus(text, docnames=rownames(ie2010Corpus$documents))

> class(text.corpus)
[1] "corpus" "list"

> stopw <- c("a","the", "all", "some")
> TextNoStop <- removeFeatures(text.corpus, features = stopw)
# Error in UseMethod("selectFeatures") : 
# no applicable method for 'selectFeatures' applied to an object of class "c('corpus', 'list')"

# This is how I would theoretically continue: 
> token <- tokenize(TextNoStop, removePunct=TRUE, removeNumbers=TRUE)
> token2 <- ngrams(token,c(1,2))

おまけの質問 でスパース トークンを削除するにはどうすればよいquantedaですか? (つまり、 in に相当removeSparseTerms()tmます。


更新@Ken の回答に照らして、次のコードを段階的に進めるコードを次に示しますquanteda

library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’

1) カスタムの句読点と数字を削除します。たとえば、ie2010 コーパスの「\n」に注意してください。

text.corpus <- ie2010Corpus
texts(text.corpus)[1]      # Use texts() to extrapolate text
# 2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery.\nIt is

texts(text.corpus)[1] <- gsub("\\s"," ",text.corpus[1])    # remove all spaces (incl \n, \t, \r...)
texts(text.corpus)[1]
2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery. It is of e

前処理を好む理由についての追加のメモ。私の現在のコーパスはイタリア語で書かれており、冠詞がアポストロフィで単語に接続されています。したがって、ストレートdfm()は不正確なトークン化につながる可能性があります。例えば:

broken.tokens <- dfm(corpus(c("L'abile presidente Renzi. Un'abile mossa di Berlusconi"), removePunct=TRUE))

は、同じ単語に対して 2 つの別個のトークン ("un'abile" と "l'abile") を生成するため、gsub()ここで追加の手順が必要になります。

2)quantedaトークン化の前に、テキスト内のストップワードを直接削除することはできません。前の例では、誤解を招くバイグラムを生成しないように、「l」と「un」を削除する必要があります。これは で処理できtmますtm_map(..., removeWords)

3) トークン化

token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2)

4) dfm を作成します。

dfm <- dfm(token)

5) まばらな特徴を取り除く

dfm <- trim(dfm, minCount = 5)
4

1 に答える 1

7

私たちdfm()は「ブラック ボックス」としてではなく、一般的なユーザーがテキストをドキュメントや機能のマトリックスに変換する際に適用したい多くのオプションを組み合わせたスイス アーミー ナイフとして設計しました。ただし、これらのオプションはすべて、より細かいレベルの制御を行いたい場合に、低レベルの処理コマンドからも利用できます。

ただし、 quantedaの設計原則の 1 つは、テキストはトークン化のプロセスを通じてのみ「機能」になるということです。除外したい一連のトークン化された機能がある場合は、最初にテキストをトークン化する必要があります。そうしないと、それらを除外できません。R の他のテキスト パッケージ (たとえばtm ) とは異なり、これらの手順はコーパスの「下流」で適用されるため、コーパスは操作が適用される未処理のテキスト セットのままになります (ただし、それ自体は変換されたテキスト セットにはなりません)。 . この目的は、一般性を維持することだけでなく、テキスト分析の再現性と透明性を促進することです。

ご質問への回答:

  1. ただし、関数を使用して推奨される動作をオーバーライドすることができますtexts(myCorpus) <-。この場合、テキストに割り当てられたものが既存のテキストをオーバーライドします。したがって、正規表現を使用して句読点と数字を削除できます。たとえば、stringiコマンドを使用し、Unicode クラスを句読点と数字に使用してパターンを識別します。

  2. ストップワードを削除する前にトークン化することをお勧めします。「単語」はトークンであるため、テキストをトークン化する前にテキストからこれらを削除する方法はありません。正規表現を適用してそれらを置き換えることでさえ、正規表現で""何らかの形式の単語境界を指定する必要があります-これもトークン化です。

  3. ユニグラムとバイグラムにトークン化するには:

    トークン (myCorpus、ngrams = 1:2)

  4. dfm を作成するには、単に を呼び出しますdfm(myTokens)。(この段階で、ngram のステップ 3 を適用することもできます。

ボーナス 1: n=2 コロケーションはバイグラムと同じリストを生成しますが、形式が異なります。何か別の意図があったのですか?(別のSOの質問はおそらく?)

ボーナス 2: を参照してくださいdfm_trim(x, sparsity = )removeSparseTerms()オプションはほとんどの人にとって非常に紛らわしいものですが、これにはtmからの移行者が含まれています。完全な説明については、この投稿を参照してください。

ところで:texts()代わりに使用してくださいie2010Corpus$documents$texts-- コーパスのオブジェクト構造をすぐに書き直すので、エクストラクタ関数がある場合は、この方法でその内部にアクセスしないでください。(また、この手順は不要です。ここでは、単にコーパスを再作成しただけです。)

更新 2018-01 :

コーパス オブジェクトの新しい名前はdata_corpus_irishbudget2010で、コロケーション スコアリング関数はtextstat_collocations()です。

于 2016-08-14T11:06:21.760 に答える