最快的句法词汇化方法

时间:2015-11-02 22:53:06

标签: performance scala machine-learning stanford-nlp

所以我目前正在建立一个分类管道,此时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)我使用fullblown coreNLP对象的事实带来了很多开销,这会减慢一切。也许有一个更小的课程,只有lemmatizes?

b)lemmatizer需要ssplit的事实,并且POS标记似乎非常激烈,因为我只是给它单独的句子,是否有更有效的方法来找到单个词的引理?

c)也许corenlp很慢,可能会有一个更快的变形器。

任何帮助都将受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

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的主要数据结构,可用于向相同的元素添加越来越多的数据。因此,词形还原会将lemmas添加到相同的结构中。在变形器上使用POS标记以区分名词,动词等,并从那里选择POS标签。

c)是的,情况也是如此。如何处理这一点与你的意图和背景有很大的不同。我在Spark中使用CoreNLP来使用分布式集群的全部功能,我也预先计算并存储了一些这样的数据。我希望这会给你一些见解。