2014-11-18 1 views
2

구조화되지 않은 데이터를 구문 분석하기 위해 OpenNLP 토큰 이름 찾기를 사용하고 있습니다. 4MM 레코드의 코퍼스 (교육 세트)를 만들었지 만,이 코퍼스에서 모델을 생성하면서 Eclipse의 OpenNLP API는 프로세스가 3 시간이 걸리므로 시간이 많이 걸립니다. 모델은 반복 100과 컷오프 5 인 기본 매개 변수를 기반으로합니다.OpenNLP의 모델 생성 프로세스 속도를 높이는 방법

제 질문은이 프로세스의 속도를 높이려면 어떻게해야합니까? 모델 작성 프로세스에 소요되는 시간을 어떻게 줄일 수 있습니까?

코퍼스의 크기가이 문제의 원인 일 수 있지만 누군가 이러한 종류의 문제를 겪었는지, 만약 그렇다면 어떻게 해결할지를 알고 싶었습니다.

몇 가지 단서를 제공해주십시오.

미리 감사드립니다.

+0

'-Xms = 512m -Xmx = 2048m' –

+0

이것을 제안 해 주셔서 감사합니다.하지만 이미 프로세스가 10GB 공간을 차지하면서 -Xmx를 10GB로 증가 시켰습니다. 메모리를 늘린 후에도 여전히 3 시간이 걸립니다. 그래서 나는 조금 걱정하고있다. –

+0

다른 방법으로 처리 속도를 높일 수 없습니다. jar 파일로 내보내고 실행하면 ~ 500MB가 추가로 제공 될 수 있습니다 (이클립스 사용). 4 백만 건의 기록입니까? GATE (https://gate.ac.uk/)는 이보다 더 많은 시간이 걸릴 것으로 생각합니다. –

답변

4

일반적으로 이러한 문제를 처리하는 첫 번째 방법은 교육 데이터를 여러 청크로 분할하고 각 청크가 자체 모델을 생성하도록하는 것입니다. 그런 다음 모델을 병합합니다. 나는 이것이 (OpenNLP 전문가가 아니기 때문에)이 경우에 유효하지 않은지, 아래에 또 다른 해결책이있다. 또한 OpenNLP API는 단일 스레드 train() 메소드 만 제공하므로 다중 스레드 옵션을 요청하는 문제를 제기합니다.

두 가지 주요 둔화 요인 IO 및 CPU입니다 느린 단일 스레드 작동을 위해

, 모두 개별적으로 처리 할 수 ​​있습니다 :

  • IO - 당신이 하드 드라이브를 사용 하는가를? 일반 (자기) 또는 SSD? SSD로 이동하면 도움이됩니다.
  • CPU - 어떤 CPU를 사용하고 있습니까? 빠른 CPU로 이동하면 도움이됩니다. 코어의 수에주의를 기울이지 마십시오. 여기서는 원시 속도를 원합니다.

아마존 웹 서비스 또는 Google Compute Engine에서 높은 CPU 서버를 확보하고 거기에서 교육을 실행하기 위해 고려해야 할 옵션 - 나중에 모델을 다운로드 할 수 있습니다. 둘 다 Xeon (Sandy Bridge 또는 Ivy Bridge) CPU 및 로컬 SSD 스토리지를 사용하여 높은 CPU 서버를 제공합니다.

+0

작은 모델을 만든 다음 나중에 작은 모델을 하나로 병합 할 수 있습니까? 어떤 라이브러리가이를 지원하는지 궁금합니다. –

+0

안녕하세요 @Nikhil, 내가 쓴 것처럼, 나는 NLP 전문가가 아니므로 단지 아이디어 일뿐입니다. 내 대답에서 알 수 있듯이 다른 옵션을 나열 했으므로 가능하지 않다고 생각합니다. –

+0

안녕하세요. David (전 3MM 레코드에서 50 분 소요)보다 훨씬 빠른 속도로 모델을 생성 한 후 RAM을 늘렸습니다. 또한 train() 메서드는 멀티 스레드를 제공하므로 일부 모델에서는 성능 향상을위한 몇 가지 스레드를 추가합니다. 좋은 제안 주셔서 감사합니다. –

3

하드웨어를 업그레이드하기 전에 알고리즘 관련 변경을해야한다고 생각합니다.
문장 크기 줄이기
연습 샘플에 불필요하게 긴 문장이 없는지 확인하십시오. 이러한 문장은 성능을 향상시키지 않지만 계산에 큰 영향을 미칩니다. (순서를 모르겠다) 나는 일반적으로 200 단어/문장으로 컷오프를 쓴다. 또한 기능을 자세히 살펴보면 기본 기능 생성자입니다.
two kinds of WindowFeatureGenerator with a default window size of only two OutcomePriorFeatureGenerator PreviousMapFeatureGenerator BigramNameFeatureGenerator SentenceFeatureGenerator
이러한 기능 생성기는 주어진 문장에서 Robert이라는 단어에 대해 다음과 같은 기능을 생성합니다.


ic

Sentence: Robert, creeley authored many books such as Life and Death, Echoes and Windows. 
Features: 
w=robert 
n1w=creeley 
n2w=authored 
wc=ic 
w&c=robert,ic 
n1wc=lc 
n1w&c=creeley,lc 
n2wc=lc 
n2w&c=authored,lc 
def 
pd=null 
w,nw=Robert,creeley 
wc,nc=ic,lc 
S=begin 

lc 이러한 기능 S=begin

Robert이 문장의 시작에 발생했음을 표시하는 유일한 문장 의존하는 기능입니다 소문자를하고, 초기 자본입니다.
내 요점은 교육에서 완전한 문장의 역할을 설명하는 것입니다. 실제로 SentenceFeatureGenerator를 삭제하고 문장 크기를 줄여 원하는 엔터티의 창에 몇 단어 만 수용 할 수 있습니다.이것은 잘 작동 할 것입니다.
이것이 성능에있어 복잡성에는 거의 영향을 미치지 않을 것이라고 확신합니다.

샘플링을 고려해 보셨습니까?
위에서 설명한 것처럼 기능은 매우 희박한 컨텍스트를 나타냅니다. 피쳐 생성기에서 볼 수 있듯이 중복 된 문장이 많을 수 있습니다. 다양한 패턴을 가진 문장을 표현하는 방식으로 이것들과 표본을 탐지하십시오. 그것들과 모두 일치하는 몇 가지 정규 표현식 만 작성하는 것은 불가능합니다. 내 경험상, 다양한 패턴을 가진 훈련 표본은 소수의 패턴을 가진 표본보다 훨씬 낫습니다. 이 방법으로 샘플링하면 모델 성능에 전혀 영향을주지 않습니다.

감사합니다.

+0

답변을 주셔서 감사합니다 Vihari. 나는 당신의 요지를 이해하지만 어떻게 문장 기능 생성기를 떨어 뜨릴 수 있습니까? OpenNLP는 어떤 기능을 볼 수 있습니까? 당신은 어떻게 위의 문장에 대한 기능을 생성했는지 공유 할 수 있습니까? 일단 기능 생성기를 얻으면 복제본을 식별하려고 시도 할 것입니다. 프로그래밍 방식으로 생성 할 때 훈련 세트에 중복이있을 수 있습니다. –

+0

Sentence Feature Generator는 멋진 문장 토큰 화기이며 어떤 식 으로든 성능에 영향을주지 않습니다. OpenNLP는 기능을보기 위해 명령 행 유틸리티를 제공하지 않습니다. 나는 그들의 코드에 print 문을 거의 추가하지 않았다. 대답에서 말했듯이이 기능은 엔티티의 작은 창 (OpenNLP가 이벤트라고 부름)에만 의존하며 이러한 엔티티를 식별하고 그 주변의 창을 유지하며 문장과 같은 하위 문장을 내 보냅니다. 또는 더 쉬운 두 번째 방법 (샘플링)을 시도해보십시오 (정규 표현식을 몇 개 모아야 만합니다). 그리고 저는 더 확신합니다. –

+0

안녕 데이비드, 구문 분석 프로세스를 병렬로 스파크와 오픈 nlp를 통합하는 옵션이 있습니까? –

관련 문제