StanfordCoreNLP е златният стандарт в езиковата обработка и достатъчно добра причина за всеки, който сериозно се занимава с обработка на естествен език, изчислителна лингвистика или копаене на текст, да обмисли JVM език. Този урок представя как да стартирате и стартирате минимална функция за анализ на StanfordCoreNLP с Clojure, функционалния Lisp за JVM.

Настройвам

Тъй като StanfordCoreNLP не е само един .jar файл, а цял набор от тях, препоръчвам използването на lein-resource-expand за този проект. Това ви позволява да посочите директорията, в която се намират всички StanfordCoreNLP .jar файлове и да използвате глобална нотация (т.е.: mypath/CoreNLP/*.jar), за да ги изберете всички. В противен случай първата стъпка е да добавите файловете StanfordCoreNLP към вашия път към ресурса.

В Leinengen това изглежда така:

(comment with resource expand!) :resource paths ["mypath/myjars/stanford-corenlp-full-2018"]

Първи стъпки

След като сте настроили проекта и .jars на вашия ресурсен път, време е да стартирате CoreNLP.

Подходът на CoreNLP е да се настроят „тръбопроводи“ за анализ и след това да се приложат тези канали към „анотации“. Така че нашата работа е да вкараме тези Java класове в Clojure.

За да направим това, просто трябва да инициираме класа StanfordCoreNLP с някои свойства, които му казват кои анотации да приложи.

(def myProps (java.util.Properties.)) (. myProps setProperty "annotators" "tokenize, ssplit, pos") (def nlPipe (edu.stanford.nlp.pipeline.StanfordCoreNLP. myProps))

Тук създадохме свойства myProps, настроихме го да обработва токенизация, разделяне на изречения и маркиране на части от речта – пълният списък с анотатори е наличен тук – и го използвахме, за да инициираме nlPipe, нашата NLP линия.

След това, за да анализираме текст, ние просто създаваме обект за анотация и го анотираме с нашия конвейер, nlPipe.

(def sentences (edu.stanford.nlp.pipeline.Annotation. "I'll meet you by the Sample Gates. Do you know where that is?")) (.annotate nlPipe sentences) (.jsonPrint nlPipe sentences *out*)

Ако сте стигнали дотук, трябва да видите куп JSON, отпечатан във вашия терминал. Казахме на тръбопровода да анотира нашия обект за анотация и да отпечата резултатите в JSON. Ако не искате вашите данни в JSON, можете да проверите документацията за това как да върнете тези данни по различни начини.

Става по-функционален

Сега, това може да е бил бърз и лесен начин за обработка на някакъв текст, но не беше функционален начин. Освен това не искаме нашите данни в терминала, искаме ги във формат, който можем да предаваме в Clojure. Нека създадем обвивка, за да направим всичко това.

(defn pipe2JSON [pipeline t] (let [txt (.process pipeline t)] (let [buffer (java.io.StringWriter.)] (.jsonPrint pipeline txt buffer) (json/parse-string (.toString buffer)))))

И тогава нека го покажем, като отпечатаме етикетите за част от речта за първото изречение:

(let [a (pipe2JSON nlpipe "I'll meet you by the Sample Gates. Do you know where that is?") ] (println (map (fn [x] (get x "pos")) (get (get (get a "sentences") 0)"tokens"))))

Тук нашата функция pipe2JSON взема конвейер и го прилага към низ, JSON-отпечатва този низ в обект, който след това превръщаме в познат Clojure PersistentArrayMap.

Повече ▼…

StanfordCoreNLP има много повече функции от описаните тук. Ако анализирате скромни количества данни, това трябва да е достатъчно; ако искате да правите НЛП за напреднали или НЛП в по-голям мащаб, прочетете документацията. Добро място за начало е разбирането на класа StanfordCoreNLP

Кодът за този урок е достъпен в моя GitHub

Първоначално публикувано на www.jtwolohan.com.