对句子进行词形还原的最快方法

Fastest way to lemmatize sentences

所以我目前正在构建一个 class化管道,此时 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 对象这一事实带来了很多开销,这会减慢一切。也许有一个更小的 class 只能词形还原?

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

c) 也许 corenlp 只是速度慢,可能会有更快的词形还原器。

非常感谢任何帮助!

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 的主要数据结构,用于向相同的元素添加越来越多的数据。所以词形还原会将词条添加到相同的结构中。词性标记将用于词形还原器以区分名词、动词等,并且也会从那里选择词性标签。

c) 是的,也是这样。如何处理这个问题因您的意图和背景而异。例如,我在 Spark 中使用 CoreNLP 来使用分布式集群的全部功能,并且我也在预先计算和存储其中的一些数据。我希望这能给你一些见识。