많은 문서 모음이 있습니다.직류
, (수백만 행 포함)데이터 프레임
구조
doc_id body
1 'sdfadfs...'
2 'dfadf...'
3 'sadf....'
또한 약 10,000개의 용어(또는 하위 문자열)가자귀
(term=c('sfa','adfa','dfad',...)
).
각 문서에 대한 각 용어의 발생을 찾고 싶습니다.직류
. 결국, 나는 다음과 같은 결과를 원합니다.
doc_id term
1 'sfa'
1 'dfad'
2 'adfa'
3 'sfa'
3 'dfad'
현재 다음 code를 사용하고 있습니다(stri_detect_fixed
)
res_all=lapply(terms,function(term_i){ #loop over each term
res=stri_detect_fixed(dc$body,term_i) #check occurrence of one term in each document
data.frame(doc_id=which(res),term=term_i)
})
bind_rows(res_all)
그러나 위의 code는 상당히 느립니다. code 속도를 높이기 위해 할 수 있는 일이 있습니까?
@MikaelJagan 그냥 '만약'
Ding Li2022-02-15 13:30:12루프를 병렬화해 보셨습니까(예: lapply를 parallel::mclapply로 교체)? 또는 용어 중첩을 기반으로 한 최적화에 대해 생각하고 있습니까? 문자열에 하위 문자열로 "a"가 없으면 하위 문자열로 "ab"를 가질 수 없습니다.
Mikael Jagan2022-02-15 13:30:12FWIW에서 수천 개의 데이터 프레임 목록을 만드는 것은 매우 비효율적입니다. 함수가 which(res)만 반환하도록 하는 것이 좋습니다. 그런 다음 data.frame(doc_id= unlist(res_all, FALSE, FALSE), term= rep.int(gl(length(terms), 1L,labels= terms), lengths(res_all, FALSE)로 데이터 프레임을 효율적으로 구성할 수 있습니다 )).
Mikael Jagan2022-02-15 13:30:12이 작업의 병목 현상은 일치 자체보다는 많은 문서에 대해 수백만 행을 읽는 데이터 I/O에 있을 수 있습니다. 아마도 awk 사람들에게 질문을 쏠 가치가 있습니까?
Donald Seinen2022-02-15 13:30:12
주어진 문서에 대해 용어가 발생하는지 알고 싶습니까? 아니면 용어가 몇 번 발생하는지 알고 싶습니까?
Mikael Jagan2022-02-15 13:30:12