3

非構造化テキストから部分文字列を抽出しようとしています。たとえば、国名のベクトルがあるとします。

countries <- c("United States", "Israel", "Canada")

この文字値のベクトルを渡して、構造化されていないテキストから正確な一致を抽出するにはどうすればよいですか。

text.df <- data.frame(ID = c(1:5), 
text = c("United States is a match", "Not a match", "Not a match",
         "Israel is a match", "Canada is a match"))

この例では、目的の出力は次のようになります。

ID     text
1      United States
4      Israel
5      Canada

gsubこれまでのところ、一致しないものをすべて削除してから削除してから、空の値を持つ行を削除する作業を行ってきました。str_extractstringr パッケージからも作業を行っていますが、正規表現の引数を正しく取得することに成功していません。どんな援助でも大歓迎です!

4

3 に答える 3

3

を使用したアプローチは次のdata.tableとおりです。

library(data.table)
##
R>  data.table(text.df)[
    sapply(countries, function(x) grep(x,text),USE.NAMES=F),
    list(ID, text = countries)]
   ID          text
1:  1 United States
2:  4        Israel
3:  5        Canada
于 2015-03-22T16:32:40.023 に答える
3

1.ストリンガー

最初に「indx」(「countries」ベクトルを折りたたんで形成されたもの) を「grep」のパターンとして使用して「text.df」をサブセット化し、次に「str_extract」を使用して「text」列からパターン要素を取得し、割り当てます。サブセット データセット ('text.df1') の 'text' 列に

library(stringr)
indx <- paste(countries, collapse="|")
text.df1 <- text.df[grep(indx, text.df$text),]
text.df1$text <- str_extract(text.df1$text, indx)
text.df1
#  ID          text
#1  1 United States
#4  4        Israel
#5  5        Canada

2.ベースR

外部パッケージを使用せずに、「ind」にある文字以外の文字を削除できます

text.df1$text <- unlist(regmatches(text.df1$text, 
                           gregexpr(indx, text.df1$text)))

3. ひも

stri_extractからより速いものを使用することもできますstringi

library(stringi)
na.omit(within(text.df, text1<- stri_extract(text, regex=indx)))[-2]
#  ID         text1
#1  1 United States
#4  4        Israel
#5  5        Canada
于 2015-03-22T16:29:35.620 に答える