2015-10-21 2 views
2

Я пытаюсь сделать искровое задание, которое классифицирует, разрезая документ на предложения, а затем леммитируя каждое слово в предложении для логистической регрессии. Тем не менее, я нахожу, что класс аннотаций Стэнфорд вызывает серьезную проблему в моей искровой работе (это занимает 20 минут, чтобы обрабатывать только 500k документов)coreNLP значительно замедляет работу искры

Вот код, который я сейчас использую для предложения анализа и классификаций

Предложение синтаксического анализа:

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 
    } 
) 
} 

Пожалуй т вот класс, который включает только часть обработки?

+0

Какие аннотации вы используете? Похоже, все, что вам нужно, это лемы, а это значит, что вам нужно запустить «tokenize, ssplit, pos, lemma». –

ответ

7

Попробуйте использовать CoreNLP's Shift Reduce parser implementation.

Основной пример (набрав это без компилятор):

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) 

Я работаю на производственной системе, которая использует CoreNLP в конвейере обработки искры. Использование анализатора Shift Reduce с помощью Beam search улучшило скорость анализа моего конвейера в 16 раз и уменьшило объем рабочей памяти, необходимый для синтаксического анализа. Парсер Shift Reduce является линейным по сложности выполнения, что лучше, чем стандартный лексикализованный парсер PCFG.

Для использования парсера с уменьшением сдвига вам понадобится jar, который вы должны поместить на свой путь к классу (который вы можете загрузить с сайта CoreNLP отдельно).

+0

Большое вам спасибо! Я начал изучать парсер SR и анализатор нейронной сети, и оба они выглядят как ДЕЙСТВИТЕЛЬНО хорошие пути для проверки. Я очень ценю вашу помощь! –

+0

Привет Тейлор, я искал сдвиг, чтобы уменьшить парсинг, и по какой-то причине он работает ДЕЙСТВИТЕЛЬНО медленно. Я даже зашел так далеко, чтобы дать JVM 6G памяти, так что размер модели не будет ограничивающим фактором, но по какой-то причине, даже если вы не учитываете время, затраченное на создание процессора. только обработка 100 предложений в секунду (в отличие от 1000 предложений для PCFG). Есть ли шанс, что вы могли бы сообщить мне, если я что-то делаю неправильно? Спасибо! http://pastebin.com/S0ZyN7Fp –

+0

Я ничего не вижу сразу, что приведет к тому, что парсер SR в вашем коде будет работать медленнее. Я попробую ваш код здесь немного по некоторым моим собственным данным и посмотрю, смогу ли я повторить вашу проблему. –

Смежные вопросы