2016-06-16 8 views
3

これはかなり簡単なはずです。私は正規表現に変換したglobの形式になっている用語の辞書を持っています。私がそれらを正規表現に変換したのは、tmパッケージがそのパッケージだけで動作すると思うからです。それはいいです。しかし、私は複数の辞書用語を渡すことによってtermDocumentMatrixをサブセット化する方法を理解することはできません。もう一つの紆余曲折は、辞書の用語が複数の長さを持ち、いくつかは1、いくつかは2、あるものは3つの単語です。正規表現の辞書でTermDocumentMatrixをフィルタリングする

以下は私の現在のコードです。

#load libraries 
library(tm) 
library(stringi) 
#Load corpus crude part of tm package 
data(crude) 
#make tokenizer to account for multi-word dictionaries 
myTokenizer <- 
function(x) 
unlist(lapply(ngrams(words(x), 1:3), paste, collapse = " "), 
use.names = FALSE) 
#make TermDocumentMatrix 
tdm<-TermDocumentMatrix(crude, control=list(tokenizer=myTokenizer)) 
#Make dictionary of regular expressions 
dict<-c('^also$', '^told reuters$', '^an emergency$', '^in world oil$') 
#This is what I am working with 
inspect(
tdm[sapply(dict, function(x) stri_detect_regex(tdm$dimnames$Terms,  
pattern=x)),] 
) 
+0

は、それに先行する単語が文字値の最後にある場合にのみ、試合があるだろうことを意味し、追加のキャレットが唯一の完全一致をすることを意味します。 –

+0

OK、私はそれで遊ぶことができますが、供給の中核的な問題についてはどうでしょうか複数の正規表現を使用してTermDocumentMatrixをフィルタリングする – spindoctor

答えて

1

私は今crudeデータセットがテストを許可し、それらのパッケージのいずれかの一部であることがわかります。

> sum(sapply(dict, grepl, x=tdm$dimnames$Terms)) 
[1] 4 
> dict2<-c('also', 'told reuters', 'an emergency', 'in world oil') 
> sum(sapply(dict2, grepl, x=tdm$dimnames$Terms)) 
[1] 51 

あなたはグレップを使用した場合のものが一致しているかを確認することができます。これは、パターンの中からキャレットとドル記号を削除すると、ターゲットに合わせ発見される項目の非常に大きな数を可能にすることを示しています。

> sapply(dict2, grep, x=tdm$dimnames$Terms) 
$also 
[1] 707 708 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 
[19] 754 1485 1486 2434 2881 2882 2988 2989 3399 3400 3782 3983 5265 5995 6088 6382 6383 6893 
[37] 7427 7428 7524 7525 7605 

$`told reuters` 
[1] 3013 7209 7210 

$`an emergency` 
[1] 779 780 781 2437 2642 4205 

$`in world oil` 
[1] 3276 

TDMのための印刷方法は特に有益ではありませんが、内部にあるものを見るためにdputで値を「爆発」することができます(greplからの結果は、限りTDM $は$規約をdimnamesとして4 timesdだろう:正規表現パターンの最後にドル記号を置く

> dput(tdm[ sapply(dict2, grepl, x=tdm$dimnames$Terms), ]) 
structure(list(i = c(1L, 2L, 3L, 8L, 9L, 33L, 3L, 16L, 17L, 20L, 
21L, 32L, 3L, 6L, 7L, 22L, 39L, 40L, 3L, 14L, 15L, 36L, 37L, 
38L, 3L, 12L, 13L, 27L, 28L, 41L, 3L, 10L, 11L, 25L, 26L, 30L, 
3L, 4L, 5L, 23L, 24L, 31L, 3L, 4L, 5L, 23L, 24L, 31L, 3L, 18L, 
19L, 29L, 34L, 35L), j = c(6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 
7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 
10L, 10L, 10L, 10L, 10L, 14L, 14L, 14L, 14L, 14L, 14L, 16L, 16L, 
16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 
18L, 18L, 18L), v = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), 
    nrow = 41L, ncol = 20L, dimnames = structure(list(Terms = c("ali also", 
    "ali also delivered", "also", "also called", "also called for", 
    "also contributed", "also contributed to", "also delivered", 
    "also delivered \"a", "also denied", "also denied that", 
    "also nigerian", "also nigerian oil", "also no", "also no projection", 
    "also reviews", "also reviews the", "also was", "also was lowered", 
    "but also", "but also reviews", "european weekend also", 
    "group, also", "group, also called", "he also", "he also denied", 
    "is also", "is also nigerian", "louisiana sweet also", "meeting.\" he also", 
    "private group, also", "sector, but also", "sheikh ali also", 
    "sweet also", "sweet also was", "there was also", "was also", 
    "was also no", "weekend also", "weekend also contributed", 
    "who is also"), Docs = c("127", "144", "191", "194", "211", 
    "236", "237", "242", "246", "248", "273", "349", "352", "353", 
    "368", "489", "502", "543", "704", "708")), .Names = c("Terms", 
    "Docs"))), .Names = c("i", "j", "v", "nrow", "ncol", "dimnames" 
), class = c("TermDocumentMatrix", "simple_triplet_matrix"), weighting = c("term frequency", 
"tf")) 
関連する問題