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.