对句子进行词形还原的最快方法
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 来使用分布式集群的全部功能,并且我也在预先计算和存储其中的一些数据。我希望这能给你一些见识。
所以我目前正在构建一个 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 来使用分布式集群的全部功能,并且我也在预先计算和存储其中的一些数据。我希望这能给你一些见识。