ancient-text-sanskirt

介绍

在查看了许多基于Java/JVM的 NLP 库后,我决定选择Apache OpenNLP库。原因之一是另一个开发人员(以前曾研究过)推荐了它。此外,这是一个阿帕奇项目;在过去的二十多年里,他们一直是F/OSSJava项目的伟大支持者(见维基百科)。不用说,ApacheOpenNLP是由Apache2.0许可证支持的。

此外,NLP 研究人员的这条推文为我的选择增添了一些信心:

Tweet on OpenNLP

我想说,到目前为止,我的个人经验与Apache OpenNLP相似,我呼应了简单和用户友好的API和设计。

您也可以喜欢:自然语言处理指南(第1部分)。

使用 Apache OpenNLP 探索 NLP

Java 绑定

我们将不会在这篇文章中介绍JavaAPI到ApacheOpenNLP工具,但你可以在他们的文档中找到一些例子。稍后,您还需要在本文底部的”资源”部分中登记的一些资源,以便进一步取得进展。

命令行接口

我被可用的 CLI 的简单性所吸引,它只是开箱即用的 — 例如,需要模型的位置,以及何时提供模型。它只是工作,没有额外的配置。

为了便于使用,也不必记住它支持的所有CLI参数,我已经把一些shell脚本放在一起。请查看README,深入了解它们是什么以及如何使用它们。

开始

从此时开始,您将需要以下操作:

  • Git 客户端 2.x 或更高(GitHub 上的帐户用于分叉存储库)。
  • Java 8 或更高版本(建议安装GraalVM CE 19.x 或更高版本)。
  • Docker CE 19.x 或更高版本,在进一步检查其是否运行。
  • 能够从 CLI 运行shell 脚本。
  • 了解读取/写入外壳脚本(可选)

Apache OpenNLP的 9.1 可用。

我们整理了脚本,使这些步骤变得轻松:

$ 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

注意:已提供docker 映像,以便能够运行一个 docker 容器,该容器将包含进一步所需的所有工具。您可以看到  *shared* 该文件夹已创建,该文件夹是装入容器的卷,但它实际上是在本地计算机上创建的并映射到此卷的目录。因此,任何创建或下载,即使在您退出您的容器后,也可用!

快速阅读主README文件,了解如何使用docker-runner.sh shell 脚本,并快速浏览”使用情况”部分。 此外,请查看 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= --volume /Users/swami/git-repos/awesome-ai-ml-dl/examples/nlp-java-jvm/shared:/home/nlp-java/shared neomatrix369/nlp-java:0.1
nlp-java@cf9d493f0722:~$

容器中装有您需要从探索各种NLP解决方案开始所需的所有Apache OpenNLP 脚本/工具/opennlp.sh

您将看到 apache-opennlp-1.9.1-bin.tar.gz 正在下载的项目并将其扩展到 shared 文件夹中:

% 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 名称)。

也可以从命令提示符(容器外部)访问和查看其内容。从容器内部,您看到的是:

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 操作(请查看README中的”探索 NLP 概念”部分):

任何脚本的使用帮助:您可以随时通过按方式调用脚本来查询脚本:

 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中检测语言,以了解更多示例和详细输出。检测单行文本或文章中的句子。

./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 <START:person> John <END>

有关更多示例和详细输出,请参阅”查找名称”部分。本节中有许多类型的名称查找器示例。

将文本行或文章标记到其较小的组件(即单词、标点符号、数字)。

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 中的”令牌化”部分。

分析一行文本或文章,并确定一起组合的单词或短语组(请参阅 Penn Treebank 标记集,了解令牌类型的图例)。另请参阅https://nlp.stanford.edu/software/lex-parser.shtml。

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 中的”分析器”部分。

在一行文本或文章中标记每个令牌的语音部分(请参阅 Penn Treebank 标记集,了解令牌类型的图例)。另请参阅https://nlp.stanford.edu/software/tagger.shtml。

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 <START:person> John <END>


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

通过上述代码块,我遇到了五个指标,它们对于我作为科学家、分析师甚至工程师都很有用:

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 操作的应用程序使用不同的技术堆栈放在一起
    • 包括不同的语言
  • 查找处理过的文本数据的不同公司之间的关系(定量和定性比较)

经验示例

用python编写的BetterNLP库正在做类似的事情。请参阅卡格尔内核:更好的NLP笔记本更好的NLP总结器笔记本。(在两个笔记本中搜索fortime_in_secsinside以查看报告的指标dropbox.com/s_A40A5D59DA1DBD714934FDB8F185BA34D054ECF6271E6085AF7FDED6848D8307_1573311669024_Screen+Shot+2019-11-09+at+14.59.15.png”标题\””/*(look for …&lt;/em&gt;time&lt;em&gt;in&lt;/em&gt;secs = …)

就个人而言,这是相当鼓舞人心的,也验证这是一个有用的功能(或行动)提供给最终用户。

其他概念、库和工具

下面参考资料部分提到了其他基于 Java/JVM 的 NLP 库。为简洁起见,我们不会覆盖它们。提供的链接将导致进一步的信息,为您的追求。

Apache OpenNLP工具本身中,我们只介绍了命令行访问部分,而没有介绍 Java 绑定。此外,我们尚未再次浏览该工具的所有 NLP 概念或功能,以便简洁起见,这些概念或功能仅涵盖其中少数几个概念。但是GitHub 存储库上的文档和资源应该有助于进一步探索。

您还可以通过检查docker-runner 脚本来了解如何为自己构建docker 映像。

结论

Image title

通过完成上述操作,我们可以通过探索Apache OpenNLP工具的优缺点来总结以下内容:

优点

  • 这是一个易于使用的API和理解
  • 浅学习曲线和详细文档,包含大量示例
  • 涵盖许多 NLP 功能,文档中的探索内容比上面的更多
  • 已提供简单的外壳脚本Apache OpenNLP 脚本以使用该工具
  • 下面提供大量资源来了解有关 NLP 的更多内容(请参阅下面的参考资料部分)
  • 为快速入门和探索Apache OpenNLP工具而提供的资源

缺点

  • 查看GitHub存储库,似乎开发缓慢或停滞不前(前两个提交存在很大差距,即 2019 年 5 月和 2019 年 10 月 15 日)
  • 在浏览文档中的示例时缺少一些模型(手册)
  • 提供的当前模型可能需要根据您的用例进行进一步培训,请参阅此推文:

nlp-java-jvm 示例GitHub 项目。

  • 阿帕奇 OpenNLP |GitHub |邮件列表|@apacheopennlp.
  • 文档
  • 下载
  • 用于支持文档中示例的图例
  • 在”参考资料”中的”资源”部分中查找更多内容。
  • 进一步阅读

    Comments are closed.