Scala coreNLP显著降低了spark作业的速度`

Scala coreNLP显著降低了spark作业的速度`,scala,machine-learning,apache-spark,stanford-nlp,Scala,Machine Learning,Apache Spark,Stanford Nlp,我正在尝试做一个spark的工作,通过将文档分成句子,然后对句子中的每个单词进行逻辑回归来进行分类。然而,我发现斯坦福的注释类在我的spark工作中造成了严重的瓶颈(只处理500k文档需要20分钟) 下面是我目前用于句子分析和分类的代码 句子分析: def prepSentences(text: String): List[CoreMap] = { val mod = text.replace("Sr.", "Sr") // deals with an edge case val

我正在尝试做一个spark的工作,通过将文档分成句子,然后对句子中的每个单词进行逻辑回归来进行分类。然而,我发现斯坦福的注释类在我的spark工作中造成了严重的瓶颈(只处理500k文档需要20分钟)

下面是我目前用于句子分析和分类的代码

句子分析:

def prepSentences(text: String): List[CoreMap] = {
    val mod = text.replace("Sr.", "Sr") // deals with an edge case
    val doc = new Annotation(mod)
    pipeHolder.get.annotate(doc)
    val sentences = doc.get(classOf[SentencesAnnotation]).toList
    sentences
}
然后,我获取每个coremap并按如下方式处理引理

def coreMapToLemmas(map:CoreMap):Seq[String] = {
      map.get(classOf[TokensAnnotation]).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
  }
)
}
也许有一个类只涉及部分处理?

尝试使用

一个基本示例(在没有编译器的情况下键入):

我在一个生产系统上工作,该系统在火花处理管道中使用CoreNLP。使用带有Beam搜索的Shift-Reduce解析器将管道的解析速度提高了16倍,并减少了解析所需的工作内存量。Shift-Reduce解析器在运行时复杂度上是线性的,优于标准的词汇化PCFG解析器


要使用shift-reduce解析器,您需要shift-reduce模型jar,您应该将其放在类路径上(您可以从CoreNLP的网站单独下载)。

您使用的注释器是什么?看起来您需要的只是引理,这意味着您需要运行的只是“tokenize、ssplit、pos、lemma”。非常感谢!我已经开始研究SR解析器和神经网络解析器,它们看起来都是很好的方法。我真的很感谢你的帮助!嗨,泰勒,我一直在研究shift-reduce解析,由于某种原因,它运行得非常慢。我甚至为JVM提供了6G内存,这样模型的大小就不会成为限制因素,但出于某种原因,即使不考虑构建处理器所需的时间,它也只能每秒处理100个句子(而PCFG则是1000个句子)。如果我有什么地方做错了,你能告诉我吗?非常感谢。我没有立即看到任何会导致代码中的SR解析器执行更慢的内容。稍后,我将在我自己的一些数据上试用您的代码,看看是否可以复制您的问题。谢谢@Taylor R!值得一提的是,我正在使用foreach循环(句子.foreach(originalParser.parse句子)),一次解析一个文档(一个文档有10到20个句子),对于您的数据集,每个“注释”使用的是大文本语料库还是小文本语料库?(另外,foreach循环不是用于spark作业的,现在我只是运行一个非spark程序来测试不同的解析器设置,一旦我证明了一个解析器的速度更快,就可以将它移植到spark)
val p = new Properties()
p.put("annotators", "tokenize ssplit pos parse lemma sentiment")
// use Shift-Reduce Parser with beam search
// http://nlp.stanford.edu/software/srparser.shtml
p.put("parse.model", "edu/stanford/nlp/models/srparser/englishSR.beam.ser.gz")
val corenlp = new StanfordCoreNLP(props)

val text = "text to annotate"
val annotation = new Annotation(text)
corenlp.annotate(text)