2015-11-02 23 views
1

所以我正在構建一個分類管道,此時corenlp lemmatizer似乎是一個相當重要的瓶頸。我試圖弄清楚,我是如何導致經濟下滑,或者如果詞形化一般是緩慢的。最簡單的方法來解釋句子

這裏是我當前的代碼:

def singleStanfordSentenceToLemmas(sentence: String): Seq[String] = { 
    val doc = new Annotation(sentence) 
    pipeline.annotate(doc) 
    val tokens = doc.get(classOf[TokensAnnotation]).toList 
    tokens.par.foldLeft(Seq[String]())(
     (a, b) => { 
     val lemma = b.get(classOf[LemmaAnnotation]) 
     if (!(stopWords.contains(b.lemma().toLowerCase) || puncWords.contains(b.originalText()))) 
      a :+ lemma.toLowerCase 
     else a 
     } 
    ) 
    } 

這裏是一個創建管道的代碼

val props = new Properties() 

    props.put("annotators", "tokenize, ssplit, pos, lemma") 
    val pipeline = new StanfordCoreNLP(props) 

我目前的理論是

A)的事實,我使用的是茂盛的coreNLP對象承載了大量的開銷,這會降低一切。也許還有一個只會迷惑的最小課堂?

b)事實上,lemmatizer需要ssplit和POS標記似乎相當激烈,因爲我只給它單個句子,有沒有一種更有效的方法來找到單詞的引文?

c)或許corenlp只是很慢,可能有更快的lemmatizer在那裏。

任何幫助將不勝感激!

+0

代碼運行速度有多慢?上面的代碼應該以大約10k句子/秒/ CPU核心運行,除非輸入數據中有些奇怪。如果你需要比這更快的速度,一個詞幹(例如Porter Stemmer)可能會更快。 –

回答

1

a)是的,那裏肯定有開銷。你可以擺脫它的一些,但CoreNLP看來(我)在分離的核心流水線包裝程序從底層的,更直接的entities.But你可以做相當不一致:

import edu.stanford.nlp.process.Morphology 
val morph = new Morphology() 
... 
morph.stem(label) 

您還需要像

private lazy val POSTagger = 
new MaxentTagger("edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger") 

以前標記的POS,但我認爲這讓你在正確的軌道上。

b)你不會輕易擺脫這一切。 CoreLabel是CoreNLP的主要數據結構,用於向相同的元素添加越來越多的數據。因此,詞形化將在相同的結構中添加引理句。 POS標記將用於lemmatizer中,以區分名詞,動詞等,並從那裏挑選POS標籤。

c)是的,情況也是如此。如何處理這個與你的意圖和背景有很大的不同。例如,我使用Spark內的Cor​​eNLP來使用分佈式集羣的全部功能,並且我還預先計算並存儲了一些這些數據。我希望這給你一些見解。