2017-01-24 1 views
1

가정하자 텍스트 데이터는 다음과 같습니다R은 : 문자 벡터에서 통제 어휘를 추출

voc <- c("peter", "mary", "bob", "red", "green", "blue") 

결과가 있어야한다 :

txt <- c("peter likes red", "mary likes green", "bob likes blue") 

내가이 통제 어휘에서 단어 그 문자열을 줄이고 자 벡터 :

c("peter red", "mary green", "bob blue") 

하나는 tm 라이브러리를 사용할 수 있지만, 만 제공 나 조밀 한 문서 용어 행렬 :

foo <- VCorpus(VectorSource(txt)) 
inspect(DocumentTermMatrix(foo, list(dictionary = voc))) 
Non-/sparse entries: 6/12 
Sparsity   : 67% 
Maximal term length: 5 
Weighting   : term frequency (tf) 

    Terms 
Docs blue bob green mary peter red 
    1 0 0  0 0  1 1 
    2 0 0  1 1  0 0 
    3 1 1  0 0  0 0 

벡터 요소 당 하나의 문자열로 벡터 솔루션을 얻으려면 어떻게해야합니까?

해결책은 빠릅니다. 솔루션의 비교 지금까지

내 데이터에, 제임스 솔루션은 약 4 배 빠른 Sotos보다 '나는 또한

편집 기본 R.의 큰 팬입니다. 하지만 내가 length(text) 1k에서 10k로 단계를 만들 때 그것은 메모리가 부족합니다. Sotos의 솔루션은 여전히 ​​10k에서 실행됩니다.

내 데이터가 length(txt) ~ 1M 및 length(voc) ~ 5k라고 가정 할 때, Sotos의 솔루션은 메모리가 부족하지 않으므로 완료하는 데 18 시간이 걸릴 것으로 예상됩니다.

더 빠른 것은 없나요?

apply(sapply(paste0("\\b",voc,"\\b"), function(x) grepl(x,txt)), 1, function(x) paste(voc[x],collapse=" ")) 
[1] "peter red" "mary green" "bob blue" 

sapply 부분은 당신이 TM 패키지를 사용하는 회원 행렬을 재현 :

+0

사례가 아닌 정규식 접근 방법으로 충분합니까? 예 : 'sapply (strsplit (txt, "", TRUE), function (x) paste (collapse = "", x [x % in % voc])와 같은 것임' –

+0

@alexis_laz 당신이 이긴다! 솔루션은 18 시간 대신 10 분 안에 완료됩니다. 솔루션으로 표시 할 수 있도록 전용 응답을 만드시겠습니까? – hyco

답변

2

당신은 유일한 방법은 stringi

library(stringi) 
sapply(stri_extract_all_regex(txt, paste0('\\b', voc, collapse = '|', '\\b')), paste, collapse = ' ') 
#[1] "peter red" "mary green" "bob blue" 

또는 전체 stringi

stri_paste_list(stri_extract_all_regex(txt, paste0('\\b', voc, collapse = '|', '\\b')), sep = ' ') 
#[1] "peter red" "mary green" "bob blue" 
+0

해결책을 확인하고 있습니다. 'txt <- c (빨강과 같은 peters, 녹색과 같은 marys, "blues와 같은 bob")의 결과는 비어 있어야합니다. – hyco

+0

"비어 있어야합니다"라는게 무슨 뜻입니까? – Sotos

+0

첫 번째 해결책은 '피더'에서'피터 '를 추출해서는 안된다는 뜻입니다. 다시 말해, '피터'는 통제 된 어휘에 속하지 않는다. – hyco

3

베이스를 사용할 수 있습니다 에 대한 동안, apply은 행을 반복하여 어휘에서 관련 용어를 추출하여 함께 붙여 넣습니다.

+0

@Sotos 단어 경계를 추가하기 위해 그것을 고쳤습니다, 그래서 그것은 지금 작동해야합니다. – James