2014-07-23 3 views
0

또 다른 질문은이 질문과 유사하지만 다른 프로그래밍 언어로되어 있으며 관련이 있지만 같은 문제는 아닌 것으로 보입니다. Is it possible to speed up Wordnet Lemmatizer?Java 용 WordNet lemmatizer의 사용 속도 향상

우리는 텍스트에서 수많은 단어를 줄이고 있으며 그림에서 볼 수 있듯이 형태소 분석으로 코드가 90 % 이상을 소비합니다. 우리가 코드를 프로파일 조금과 코드를 읽으면서

profiling the analysis process

, 그것은 워드 넷처럼 보였다 그는 코드 실행 시간의 대부분을 소요하는 줄기 때 실제로 파일에서 읽고! 예를 들어 파일 읽기 대신 데이터베이스를 사용하여 형태소 분석 프로세스의 데이터를 지원하거나 메모리에 필요한 모든 것을로드하고 파일을 무시함으로써 성능을 향상시킬 수 있습니까? 또는 형태소 분석 프로세스에 캐싱을 추가 하시겠습니까?

라인 판독 값을 바꾸기 위해 쉽게 연결할 수있는 도구가 있습니까?

enter image description here

당신이 볼 수 있듯이, 요약 읽기 파일이 실행 시간의 62 %를 차지한다 :

여기에 라인 읽기 프로파일을 참조하십시오.

+0

파일을 RAM에 둡니다 (예 : Linux의 경우 '/ dev/shm')? 파일이 얼마나 큽니까? OS가 충분한 RAM을 가지고 있다고 가정하면 자동으로 캐시해야합니다. – maaartinus

+0

약 36MB가 있습니다. 클래스조차도 PrincetonRandomAccessDictionaryFile이라고 부릅니다. 그래서 이것은 그들이 아마도 메모리에서 읽는 것을 의미합니다. 그러나 그것은 천천히 진행됩니다. 파일을 가져 오는 데 오랜 시간이 걸렸습니다. 그래서 그것이 작동하는 방식으로 할 수있는 무언가가 있습니까? 또는 reaad() 및 readLine()이 너무 오래 걸리는 것이 정상입니까? 나는 그들이 독서를 비효율적으로 수행하는지 여부를 결정할 방법을 모른다. – Ev0oD

+1

그것 [보이는] (http://grepcode.com/file/repo1.maven.org/maven2/net.sf.jwordnet/jwnl/1.4_rc3/net/didion/jwnl/dictionary/morph/LookupIndexWordOperation.java? av = f)에는 여러 구현이 있으므로 메모리 기반 메모리를 선택하기 만하면됩니다. – maaartinus

답변

1

FileBackedDictionary 대신 MapBackedDictionary 또는 DatabaseBackedDictionary를 사용할 수 있습니다.

MapBackedDictionary로 실행하는 방법을 설명합니다.

jwnl 유틸리티를 사용해야합니다. WordNet 프로젝트를 열면 클래스 DictionaryToMap.java main 메소드를 사용하여 기존 dicitonary 폴더를 맵 포더로 변환 할 수 있습니다.

그런 다음 FileBackedDictionary에 앞서 사용했던 file_properties.xml과 비슷한 map_properties.xml 파일을 만들 수 있습니다. 이 시간 태그는 약간 다를 것입니다. 나는 나를 위해 잘 작동하고있는 나의 예제 XML을 여기 올리고있다.

<?xml version="1.0" encoding="UTF-8"?> 
<jwnl_properties language="en"> 
<version publisher="Princeton" number="3.0" language="en"/> 
<dictionary class="net.didion.jwnl.dictionary.MapBackedDictionary"> 
    <param name="morphological_processor" value="net.didion.jwnl.dictionary.morph.DefaultMorphologicalProcessor"> 
     <param name="operations"> 
      <param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/> 
      <param value="net.didion.jwnl.dictionary.morph.DetachSuffixesOperation"> 
       <param name="noun" value="|s=|ses=s|xes=x|zes=z|ches=ch|shes=sh|men=man|ies=y|"/> 
       <param name="verb" value="|s=|ies=y|es=e|es=|ed=e|ed=|ing=e|ing=|"/> 
       <param name="adjective" value="|er=|est=|er=e|est=e|"/> 
       <param name="operations"> 
        <param value="net.didion.jwnl.dictionary.morph.LookupIndexWordOperation"/> 
        <param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/> 
       </param> 
      </param> 
      <param value="net.didion.jwnl.dictionary.morph.TokenizerOperation"> 
       <param name="delimiters"> 
        <param value=" "/> 
        <param value="-"/> 
       </param> 
       <param name="token_operations"> 
        <param value="net.didion.jwnl.dictionary.morph.LookupIndexWordOperation"/> 
        <param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/> 
        <param value="net.didion.jwnl.dictionary.morph.DetachSuffixesOperation"> 
         <param name="noun" value="|s=|ses=s|xes=x|zes=z|ches=ch|shes=sh|men=man|ies=y|"/> 
         <param name="verb" value="|s=|ies=y|es=e|es=|ed=e|ed=|ing=e|ing=|"/> 
         <param name="adjective" value="|er=|est=|er=e|est=e|"/> 
         <param name="operations"> 
          <param value="net.didion.jwnl.dictionary.morph.LookupIndexWordOperation"/> 
          <param value="net.didion.jwnl.dictionary.morph.LookupExceptionsOperation"/> 
         </param> 
        </param> 
       </param> 
      </param> 
     </param> 
    </param> 
    <param name="dictionary_element_factory" value="net.didion.jwnl.data.MapBackedDictionaryElementFactory"/> 
    <param name="file_type" value="net.didion.jwnl.princeton.file.PrincetonObjectDictionaryFile"/> 
    <param name="dictionary_path" value="path\to\wordnetMap\"/> 
</dictionary> 
<resource class="PrincetonResource"/> 
</jwnl_properties> 

wordnetMap의 경로에주의하십시오. 앞에서 설명한 방법으로 사전의 변환을 출력하는 위치로 설정하십시오.

JWNL을 새 특성 파일로 초기화하는 것을 잊지 마십시오. MapBackedDictionary는 처음에로드하는 데 시간이 오래 걸리지 만 성능이 크게 향상됩니다.

+0

이것은 정말 끔찍한 XML 난장판처럼 보입니다.필자는 파일을 단순히 프리 페칭하는 대신 유용성을 파괴하는 이유에 대해 궁금해합니다 (XML이 필요한 경우 그대로 유지해야합니다). – maaartinus

+0

무슨 뜻인지 확실하지 않습니다. 어쨌든, 저는 XML 구성이 어떻게 설정 될지에 대한 문서를 찾을 수 없기 때문에 extJwnl 라이브러리에서 일부 XML을 복사했습니다. 수정되어야 할 것을 발견하고 수정했습니다. xml 파일에는 아무런 문제가 없습니다. 일부 문서가있는 경우이 파일도 나에게 짜증이납니다. – Ev0oD