Рубрики
Без рубрики

Изучение концепций НЛП с использованием Apache OpenNLP

Сообщение, демонстрирующее концепции NLP с примерами с помощью библиотеки Java NLP под названием Apache OpenNLP. Помечено nlp, java, graal vm, машинное обучение.

После просмотра множества библиотек NLP на основе Java/JVM перечисленных в Awesome AI/ML/DL Я решил выбрать библиотеку Apache OpenNLP . Одна из причин заключается в том, что другой разработчик (который смотрел на него ранее) рекомендовал его. Кроме того, это проект Apache , они были большими сторонниками Java-проектов F/OSS в течение последних двух десятилетий или около того (см. Википедия ). Также само собой разумеется, что Apache OpenNLP поддерживается лицензией Apache 2.0 .

Кроме того, этот твит исследователя НЛП придал этому вопросу еще больше уверенности:

Я хотел бы сказать, что мой личный опыт был похож на Apache OpenNLP до сих пор и я повторяю простоту и удобство API и дизайна. Вы увидите, как мы будем исследовать это дальше, в таком случае.

Привязки Java

В этом посте мы не будем описывать Java API для Apache OpenNLP инструмента, но вы можете найти ряд примеров в их документах . Немного позже вам также понадобятся некоторые ресурсы, перечисленные в разделе Ресурсы внизу этого поста, чтобы продвинуться дальше.

Интерфейс командной строки

Меня привлекла простота доступного интерфейса командной строки, и он просто работал “из коробки” для случаев, когда требовалась модель, и когда она была предоставлена. Это просто работало бы без дополнительной настройки.

Чтобы упростить его использование, а также не запоминать все параметры интерфейса командной строки, которые он поддерживает, я собрал несколько сценариев оболочки . Взгляните на README , чтобы получить более полное представление о том, что они собой представляют и как их использовать.

Приступая к работе

С этого момента вам понадобится следующее:

  • Клиент Git 2.x или выше (учетная запись на GitHub для разветвления репозитория)
  • Java 8 или выше (рекомендуется установить Graal VM CE 19.x или выше)
  • Докер CE 19.x или выше и проверьте, работает ли он, прежде чем идти дальше
  • Возможность запускать сценарии оболочки из интерфейса командной строки
  • Понимать чтение/написание сценариев оболочки (необязательно)

Примечание: На момент написания статьи была доступна версия 1.9.1 |/Apache OpenNLP .

Мы собрали вместе сценарии , чтобы сделать эти шаги простыми для всех:

    $ git clone git@github.com:valohai/nlp-java-jvm-example.git
    or 
    $ git clone https://github.com/valohai/nlp-java-jvm-example.git
    $ cd nlp-java-jvm-example

Это приведет нас к папке со следующими файлами в ней:

    LICENSE.txt      
    README.md        
    docker-runner.sh     <=== only this one concerns us at startup
    images
    shared               <=== created just when you run the container

Примечание: изображение докера было предоставлено для запуска контейнера докера, который будет содержать все инструменты, необходимые для дальнейшего продвижения. Вы можете видеть, что создана папка *общий доступ* , которая представляет собой том, смонтированный в вашем контейнере но на самом деле это a каталог, созданный на вашем локальном компьютере и сопоставленный с этим томом. Таким образом, все, что создано или загружено там, будет доступно даже после того, как вы выйдете из своего контейнера!

Быстро ознакомьтесь с основным файлом README , чтобы получить представление о том, как использовать docker-runner.sh сценарий оболочки и бегло взгляните на раздел Использование * **также . * После этого также загляните в файл Apache OpenNLP README , чтобы увидеть использование | сценариев , представленных там.

Запустите контейнер NLP Java/JVM docker

В командной строке локального компьютера, находясь в корневом каталоге проекта, выполните следующее:

    $ ./docker-runner.sh --runContainer

Есть шанс, что вы получите это первым, прежде чем получите подсказку:

    Unable to find image 'neomatrix369/nlp-java:0.1' locally
    0.1: Pulling from neomatrix369/nlp-java
    f476d66f5408: ...
    .
    .
    .
    Digest: sha256:53b89b166d42ddfba808575731f0a7a02f06d7c47ee2bd3622e980540233dcff
    Status: Downloaded newer image for neomatrix369/nlp-java:0.1

И затем вам будет представлена подсказка внутри контейнера:

    Running container neomatrix369/nlp-java:0.1

    ++ pwd
    + time docker run --rm --interactive --tty --workdir /home/nlp-java --env JDK_TO_USE= --env JAVA_OPTS=<--snipped>
    nlp-java@cf9d493f0722:~$

Контейнер упакован со всеми Apache OpenNLP скриптами/инструментами , необходимыми для начала изучения различных решений NLP.

Установка Apache OpenNLP внутри контейнера

Вот как мы продвигаемся дальше, когда вы находитесь внутри контейнера, в командной строке контейнера:

    nlp-java@cf9d493f0722:~$ cd opennlp


    nlp-java@cf9d493f0722:~$ ./opennlp.sh

Вы увидите apache-opennlp-1.9.1-bin.tar.gz артефакт загружается и развертывается в общую папку:

    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100 10.6M  100 10.6M    0     0  4225k      0  0:00:02  0:00:02 --:--:-- 4225k
    apache-opennlp-1.9.1/
    apache-opennlp-1.9.1/NOTICE
    apache-opennlp-1.9.1/LICENSE
    apache-opennlp-1.9.1/README.html
    .
    .
    .
    apache-opennlp-1.9.1/lib/jackson-jaxrs-json-provider-2.8.4.jar
    apache-opennlp-1.9.1/lib/jackson-module-jaxb-annotations-2.8.4.jar

Просмотр общей папки и доступ к ней

Как только вы запускаете контейнер, создается общая папка, вначале она может быть пустой, но по мере продвижения мы обнаружим, что она заполняется разными файлами и папками.

Там же вы найдете загруженные модели и Apache OpenNLP двоичный файл взорвался в свой собственный каталог (по имени apache-opennlp-1.9.1 ).

Вы также можете получить доступ к его содержимому и просмотреть его из командной строки (вне контейнера).:

    ### Open a new command prompt
    $ cd nlp-java-jvm-example
    $ cd images/java/opennlp
    $ ls ..
    Dockerfile       corenlp.sh       opennlp          reverb.sh        word2vec.sh
    cogcomp-nlp.sh   mallet.sh        openregex.sh     shared
    common.sh        nlp4j.sh         rdrposttagger.sh version.txt

    $ ls ../shared
    apache-opennlp-1.9.1   en-ner-date.bin        en-sent.bin
    en-chunker.bin         en-parser-chunking.bin langdetect-183.bin

    ### In your case the contents of the shared folder may vary but the way to get to the folder is above.

Изнутри контейнера вы видите вот что:

    nlp-java@cf9d493f0722:~$ ls 
    cogcomp-nlp.sh   corenlp.sh  nlp4j.sh  openregex.sh        reverb.sh  word2vec.sh
    common.sh        mallet.sh   opennlp   rdrposttagger.sh        shared

    nlp-java@cf9d493f0722:~$ ls shared
    MyFirstJavaNotebook.ipynb      en-ner-date.bin           en-pos-maxent.bin          
    langdetect-183.bin
    apache-opennlp-1.9.1           en-ner-time.bin           en-pos-perceptron.bin  
    notebooks
    en-chunker.bin                 en-parser-chunking.bin    en-token.bin

    ### In your case the contents of the shared folder may vary but the way to get to the folder is above.

Выполнение действий NLP внутри контейнера

Хорошо то, что, даже не покидая свою текущую папку, вы можете выполнять эти действия NLP (ознакомьтесь с разделом Изучение концепций NLP в README ).:

Справка по использованию любого из сценариев: в любой момент времени вы всегда можете запросить сценарии, вызвав их таким образом:

    nlp-java@cf9d493f0722:~$ ./[script-name.sh] --help

Например, для

    nlp-java@cf9d493f0722:~$ ./detectLanguage.sh --help

дает нам этот текст использования в качестве вывода:

           Detecting language in a single-line text or article

           Usage: ./detectLanguage.sh --text [text]
                     --file [path/to/filename]
                     --help

           --text      plain text surrounded by quotes
           --file      name of the file containing text to pass as command arg
           --help      shows the script usage help text
    nlp-java@cf9d493f0722:~$ ./detectLanguage.sh --text "This is an english sentence"

    eng This is an english sentence

Смотрите Определение языков раздел в README для получения дополнительных примеров и подробных выходных данных.

  • Обнаружение предложений в однострочном тексте или статье.
    nlp-java@cf9d493f0722:~$ ./detectSentence.sh --text "This is an english sentence. And this is another sentence."


    This is an english sentence.
    And this is another sentence.

См. Обнаружение предложений раздел в README для получения дополнительных примеров и подробных выходных данных.

  • Поиск имени человека, названия организации, даты, времени, денег, местоположения, процентной информации в однострочном тексте или статье.
    nlp-java@cf9d493f0722:~$ ./nameFinder.sh --method person  --text "My name is John"


    My name is  John 

См. Поиск имен раздел в README для получения дополнительных примеров и подробных выходных данных. В этом разделе есть несколько типов примеров поиска имен.

  • Разметьте строку текста или статью на более мелкие компоненты (например, слова, знаки препинания, цифры).
    nlp-java@cf9d493f0722:~$ ./tokenizer.sh --method simple --text "this-is-worth,tokenising.and,this,is,another,one"


    this - is - worth , tokenising . and , this , is , another , one

См. Обозначьте раздел в README для получения дополнительных примеров и подробных выходных данных.

    nlp-java@cf9d493f0722:~$ ./parser.sh --text "The quick brown fox jumps over the lazy dog ."


    (TOP (NP (NP (DT The) (JJ quick) (JJ brown) (NN fox) (NNS jumps)) (PP (IN over) (NP (DT the) (JJ lazy) (NN dog))) (. .)))

Смотрите раздел Синтаксический анализатор в README для получения дополнительных примеров и подробных выходных данных.

    nlp-java@cf9d493f0722:~$ ./posTagger.sh --method maxent --text "This is a simple text to tag"


    This_DT is_VBZ a_DT simple_JJ text_NN to_TO tag_NN

Смотрите раздел Части речи с тегами в разделе README для получения дополнительных примеров и подробных выходных данных.

  • Фрагментация текста путем разделения текста или статьи на синтаксически связанные части слов, такие как группы существительных, группы глаголов. Вы применяете эту функцию к помеченным частям текста речи или статьи. Применить фрагментацию к тексту, уже помеченному POS-теггером (см. Набор тегов Penn Treebank для обозначения типов токенов, также см. https://nlpforhackers.io/text-chunking/ ).
    nlp-java@cf9d493f0722:~$ ./chunker.sh --text "This_DT is_VBZ a_DT simple_JJ text_NN to_TO tag_NN"


    \[NP This_DT \] [VP is_VBZ ] \[NP a_DT simple_JJ text_NN \] [PP to_TO ] [NP tag_NN]

См. Фрагментация раздел в README для получения дополнительных примеров и подробных выходных данных.

Выход из контейнера NLP Java/JVM docker

Это так просто, как это:

    nlp-java@f8562baf983d:~/opennlp$ exit
    exit
           67.41 real         0.06 user         0.05 sys

И вы вернетесь к подсказке вашего локального компьютера.

Одной из отличительных особенностей этого инструмента является то, что он записывает и сообщает показатели своих действий в разные моменты выполнения – время, затраченное на микро- и макроуровнях, вот пример вывода, иллюстрирующий эту функцию:

    Loading Token Name Finder model ... done (1.200s)
    My name is  John 


    Average: 24.4 sent/s
    Total: 1 sent
    Runtime: 0.041s
    Execution time: 1.845 seconds

Из вышесказанного я натолкнулся на 5 показателей, которые полезны для меня как ученого, аналитика или даже инженера:

    Took 1.200s to load the model into memory

    (Average) Processed at an average rate of 24.4 sentences per second
    (Total) Processed 1 sentence
    (Runtime) It took 0.040983606557377 (0.041 seconds) to process this 1 sentence
    (Execution time) The whole process ran for 1.845 seconds (startup, processing sentence(s) and shutdown)

Подобная информация бесценна, когда дело доходит до сравнения производительности, например:

  • между двумя или более моделями (время загрузки и производительность во время выполнения)
  • между двумя или более средами или конфигурациями
  • между приложениями, выполняющими один и тот же NLP, действие, объединенное с использованием разных стеков технологий
    • также включает в себя различные языки
  • нахождение корреляций между различными корпусами обрабатываемых текстовых данных (количественные и качественные сравнения)

Эмпирический пример

Лучшая библиотека NLP , написанная на python, делает нечто подобное, см. Каггл ядра: Лучшая записная книжка по НЛП и Лучше НЛП Резюмирует Записную книжку (поиск время_в_секундах внутри обеих записных книжек, чтобы увидеть отчетные показатели).

Лично меня это весьма вдохновляет, а также подтверждает, что это полезная функция (или действие), которую можно предложить конечному пользователю.

Есть и другие Библиотеки NLP на основе Java/JVM упомянуты в Ресурсах раздел ниже, для краткости мы не будем их описывать. Предоставленные ссылки приведут к дополнительной информации для вашего собственного поиска.

В самом инструменте Apache OpenNLP мы рассмотрели только часть доступа к командной строке, а не привязки Java. Кроме того, мы еще раз не рассмотрели все концепции или функции инструмента NLP, для краткости мы рассмотрели лишь некоторые из них. Но документация и ресурсы в репозитории GitHub должны помочь в дальнейшем изучении.

Вы также можете узнать, как создать образ докера для себя, изучив скрипт docker-runner .

Рассмотрев вышесказанное, мы можем сделать следующий вывод об инструменте Apache OpenNLP , изучив его плюсы и минусы:

Плюсы

  • Это простой в использовании и понимании API
  • Неглубокая кривая обучения и подробная документация с множеством примеров
  • Охватывает множество функций NLP, в документах есть еще больше для изучения чем мы делали выше
  • Простые сценарии оболочки и Скрипты Apache OpenNLP были предоставлены для работы с инструментом
  • Множество ресурсов, доступных ниже, чтобы узнать больше об НЛП (см. Раздел Ресурсы ниже)
  • Ресурсы, предоставленные для быстрого начала работы и изучения Apache OpenNLP инструмент

Аферы

  • Глядя на репозиторий GitHub , кажется, что разработка идет медленно или застопорилась (последние два коммита имеют большой разрыв, т.е. май 2019 года и 15 октября 2019 года)
  • При просмотре примеров в документации (руководстве) отсутствует несколько моделей
  • Текущие предоставленные модели могут нуждаться в дальнейшем обучении в соответствии с вашими вариантами использования, см. Этот твит:

Apache OpenNLP

Обо мне

Мани Саркар – страстный разработчик, в основном в области Java/JVM, в настоящее время укрепляющий команды и помогающий им ускоряться при работе с небольшими командами и стартапами, в качестве внештатного инженера по программному обеспечению/данным/ml, подробнее ….

Твиттер: @theNeomatrix369 | Гитхаб: |/@neomatrix369

Первоначально опубликовано по адресу https://blog.valohai.com .

Оригинал: “https://dev.to/neomatrix369/exploring-nlp-concepts-using-apache-opennlp-5g3o”