2

似たような単語を含む 2 つのコーパスがあります。setdiffを使用しても実際には私の目的に役立たないほど十分に似ています。そこで、より頻繁に使用される単語のリストまたはコーパス (最終的にワードクラウドを作成するため) を抽出する方法を見つける方向に向かいました (このようなものにしきい値があると仮定すると、おそらく 50% より頻繁になるのでしょうか?) コーパスで # 1、コーパス #2 と比較。

これは私が今持っているすべてです:

> install.packages("tm")
> install.packages("SnowballC")
> install.packages("wordcloud")
> install.packages("RColorBrewer")
> library(tm)
> library(SnowballC)
> library(wordcloud)
> library(RColorBrewer)

> UKDraft = read.csv("UKDraftScouting.csv", stringsAsFactors=FALSE)
> corpus = Corpus(VectorSource(UKDraft$Report))
> corpus = tm_map(corpus, tolower)
> corpus = tm_map(corpus, PlainTextDocument)
> corpus = tm_map(corpus, removePunctuation)
> corpus = tm_map(corpus, removeWords, c("strengths", "weaknesses", "notes",  "kentucky", "wildcats", stopwords("english")))
> frequencies = DocumentTermMatrix(corpus)
> allReports = as.data.frame(as.matrix(frequencies))

> SECDraft = read.csv("SECMinusUKDraftScouting.csv", stringsAsFactors=FALSE)
> SECcorpus = Corpus(VectorSource(SECDraft$Report))
> SECcorpus = tm_map(SECcorpus, tolower)
> SECcorpus = tm_map(SECcorpus, PlainTextDocument)
> SECcorpus = tm_map(SECcorpus, removePunctuation)
> SECcorpus = tm_map(SECcorpus, removeWords, c("strengths", "weaknesses", "notes", stopwords("english")))
> SECfrequencies = DocumentTermMatrix(SECcorpus)
> SECallReports = as.data.frame(as.matrix(SECfrequencies))

したがって、「wingspan」という単語の頻度がコーパス #2 (「SECcorpus」) では 100 カウントであるが、コーパス #1 (「コーパス」) では頻度が 150 である場合、その単語を結果のコーパス/リストに含める必要があります。

4

2 に答える 2

3

Paul Nulty と一緒に開発した新しいテキスト分析パッケージに基づいて、より簡単な方法を提案できます。これは quanteda と呼ばれ、CRAN およびGitHubで入手できます。

私はあなたのテキストにアクセスできませんが、これはあなたの例でも同様の方法で機能します. 2 つのドキュメント セットのコーパスを作成し、( を使用して) ドキュメント変数を追加docvarsし、新しいドキュメント パーティション変数でグループ化されたドキュメント特徴マトリックスを作成します。残りの操作は簡単です。以下のコードを参照してください。デフォルトでは、dfmオブジェクトはスパース マトリックスですが、機能のサブセット化はまだ実装されていないことに注意してください (次のリリース!)。

install.packages(quanteda)
library(quanteda)

# built-in character vector of 57 inaugural addreses
str(inaugTexts)

# create a corpus, with a partition variable to represent
# the two sets of texts you want to compare
inaugCorp <- corpus(inaugTexts, 
                    docvars = data.frame(docset = c(rep(1, 29), rep(2, 28))),
                    notes = "Example made for stackoverflow")
# summarize the corpus
summary(inaugCorp, 5)

# toLower, removePunct are on by default
inaugDfm <- dfm(inaugCorp, 
                groups = "docset", # by docset instead of document
                ignoredFeatures = c("strengths", "weaknesses", "notes", stopwords("english"))),
                matrixType = "dense")

# now compare frequencies and trim based on ratio threshold
ratioThreshold <- 1.5
featureRatio <- inaugDfm[2, ] / inaugDfm[1, ]
# to select where set 2 feature frequency is 1.5x set 1 feature frequency
inaugDfmReduced <- inaugDfm[2, featureRatio >= ratioThreshold]

# plot the wordcloud
plot(inaugDfmReduced)

おそらく、プロットされるフィーチャの最小数を制限するために、いくつかのオプションをwordcloud()(使用するもの) に渡すことをお勧めします。plot.dfm()

quantedaパッケージの使用に関するご質問がございましたら、喜んでお手伝いさせていただきます。

新しい

これがあなたの問題を直接突き刺すものです。私はあなたのファイルを持っていないので、それが機能することを確認できません。また、R のスキルが限られている場合、これを理解するのは難しいかもしれません。の (悲しいことに今のところ制限されている) ドキュメントのいずれも見ていない場合も同様ですquanteda

(コメント/クエリに基づいて)必要なものは次のとおりです。

# read in each corpus separately, directly into quanteda
mycorpus1 <- corpus(textfile("UKDraftScouting.csv", textField = "Report"))
mycorpus2 <- corpus(textfile("SECMinusUKDraftScouting.csv", textField = "Report"))
# assign docset variables to each corpus as appropriate 
docvars(mycorpus1, "docset") <- 1 
docvars(mycorpus2, "docset") <- 2
myCombinedCorpus <- mycorpus1 + mycorpus2

dfm次に、 を に置き換えmyCombinedCorpusて、上記の手順に進みますinaugTexts

于 2015-05-30T21:54:58.547 に答える