因此,我目前正在构建一个分类管道,此时,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/