>source

많은 문서 모음이 있습니다.직류, (수백만 행 포함)데이터 프레임구조

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 속도를 높이기 위해 할 수 있는 일이 있습니까?

주어진 문서에 대해 용어가 발생하는지 알고 싶습니까? 아니면 용어가 몇 번 발생하는지 알고 싶습니까?

Mikael Jagan2022-02-15 13:30:12

@MikaelJagan 그냥 '만약'

Ding Li2022-02-15 13:30:12

루프를 병렬화해 보셨습니까(예: lapply를 parallel::mclapply로 교체)? 또는 용어 중첩을 기반으로 한 최적화에 대해 생각하고 있습니까? 문자열에 하위 문자열로 "a"가 없으면 하위 문자열로 "ab"를 가질 수 없습니다.

Mikael Jagan2022-02-15 13:30:12

FWIW에서 수천 개의 데이터 프레임 목록을 만드는 것은 매우 비효율적입니다. 함수가 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
  • 이전 사전을 사용하는 Python의 Lambda 함수
  • 다음 java : 그래프가 트리 데이터 구조인지 확인하시겠습니까?