因此,我目前正在构建一个分类管道,此时,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)由于我只给单个词加上句子,所以使词形分解器需要拆分,并且POS标签似乎非常强烈,是否有更有效的方法来查找单个词的词根?

c)可能corenlp速度很慢,并且可能有更快的lemmatizer。

任何帮助将不胜感激!

最佳答案

a)是的,那里肯定有开销。您可以摆脱其中的一部分,但是(在我看来)CoreNLP在将核心Pipeline Wrappers与底层,更直接的实体分离时似乎相当不一致,但是您可以这样做:

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标记将在词义分析器中使用,以区分名词,动词等,并且还将从中选择POS标记。

c)是的,也是这种情况。如何处理此问题取决于您的意图和上下文。例如,我正在Spark内部使用CoreNLP来利用分布式集群的全部功能,并且我还预先计算并存储了其中一些数据。我希望这能给您一些见识。

关于performance - 使句子定格的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33488504/

10-12 22:14