作者:明明如月学长

自然语言处理(NLP)是人工智能(AI)的一个分支,使计算机能够像人类一样理解书面或口头语言。
在这个 AI 革命时代,NLP 具有多样化的应用。
在本教程中,我们将探讨 Java 中不同的 NLP 库,以及如何使用 Apache OpenNLP 和 Stanford CoreNLP 实现一些 NLP 任务。

2、什么是 NLP

NLP 使计算机能够像人类一样处理文本和单词。它将计算语言学与统计学、深度学习和机器学习相结合。
人们每天通过各种媒介在线互动。在这个过程中,他们分享了不同类型的数据,如文本、语音、图像等。这些数据对于理解人类行为和习惯至关重要。因此,它们被用来训练计算机模仿人类智能。
NLP利用数据训练机器模仿人类的语言行为。为了实现这一目标,它遵循一个包含若干步骤的过程:

  1. 将文本划分为更小的单元,如句子或单词。
  2. 对文本进行分词,即为每个单词分配一个唯一标识符。
  3. 去除停用词,这些是在文本中不增加太多意义的常用词,如“the”、“a”、“and”等。
  4. 对文本进行词干提取或词形还原,即将每个单词简化为其词根形式或词典形式。
  5. 为每个单词标注其词性。
  6. 为每个单词标注其命名实体,如人物、地点、组织等。

3、NLP 的应用案例

NLP 是许多现代实际应用中机器智能的驱动力。
机器翻译是一个示例应用场景。我们有可以将一种特定语言翻译成另一种语言的系统。谷歌翻译就是一个例子。驱动机器翻译的技术基于NLP算法。
此外,另一个热门的应用案例是垃圾邮件检测。大多数流行的电子邮件服务提供商使用垃圾邮件检测器来确定收到的邮件是否为垃圾邮件。垃圾邮件检测应用了NLP文本分类技术,根据其语言模式识别垃圾邮件。
此外,AI 聊天机器人现在非常普遍。流行的例子包括 Siri、Google Assistant、Alexa 等。这些应用程序使用语音识别和自然语言识别语音中的模式,并做出适当、有帮助的回应。
NLP 是这些应用程序的核心逻辑,因为它使它们能够处理自然语言输入和输出,如文本和语音,并理解其中的意义和意图。

4、OpenNLP

Apache OpenNLP 是一个利用机器学习处理自然语言文本的工具包。它为常见的 NLP 任务(如分词、分割、词性标注等)提供支持。

java 做人工智能 java人工智能教程_自然语言处理


Apache OpenNLP 的主要目标是为 NLP 任务提供支持,并为不同语言提供大量预构建模型。此外,它还提供了一个命令行界面(CLI),便于实验和训练。

Apache OpenNLP 有各种预构建模型可供下载。让我们使用一个预构建模型来实现一个简单的语言检测器。首先,让我们将 OpenNLP 依赖添加到 pom.xml 中:

<dependency>
    <groupId>org.apache.opennlp</groupId>
    <artifactId>opennlp-tools</artifactId>
    <version>2.1.1</version>
</dependency>

接下来,让我们使用 langdetect-183.bin预构建模型来实现语言检测器:

@Test
void givenTextInEnglish_whenDetectLanguage_thenReturnsEnglishLanguageCode() {
        
    String text = "the dream my father told me";
    LanguageDetectorModel model;
    
    try (InputStream modelIn = new FileInputStream("langdetect-183.bin")) {
        model = new LanguageDetectorModel(modelIn);
    } catch (IOException e) {
        return;
    }
    
    LanguageDetectorME detector = new LanguageDetectorME(model);
    Language language = detector.predictLanguage(text);
    assertEquals("eng", language.getLang());
}

在上面的示例中,我们从 OpenNLP 获取预构建模型以检测语言,并将其放置在根目录中。然后,我们定义输入数据。接下来,我们加载语言检测器模型。最后,我们创建一个新的 LanguageDetectorME 实例并尝试检测语言。我们使用返回的语言测试预期的语言。

5、Stanford NLP

Stanford NLP 团队提供了允许机器处理、生成和理解人类文本和语言的算法。

java 做人工智能 java人工智能教程_java_02


CoreNLP 是由 Stanford NLP 团队用 Java 编写的一组程序,可以执行各种 NLP 任务,如分词、词性标注、词形还原等。它可以通过命令行、Java 代码或对服务器的调用来使用。

让我们看一个使用 Stanford CoreNLP 进行分词的例子。我们需要将其依赖项添加到 pom.xml 中:

<dependency>
    <groupId>edu.stanford.nlp</groupId>
    <artifactId>stanford-corenlp</artifactId>
    <version>4.5.3</version>
</dependency>

接下来,让我们进行分词:

@Test
void givenSampleText_whenTokenize_thenExpectedTokensReturned() {
    Properties props = new Properties();
    props.setProperty("annotators", "tokenize");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
        
    String text = "The german shepard display an act of kindness";
    Annotation document = new Annotation(text);
    pipeline.annotate(document);
        
    List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);
    StringBuilder tokens = new StringBuilder();
    
    for (CoreMap sentence : sentences) {
        for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) {
            String word = token.get(CoreAnnotations.TextAnnotation.class);
            tokens.append(word).append(" ");
        }
    }
    assertEquals("The german shepard display an act of kindness", tokens.toString().trim());
}

在上面的示例中,我们使用分词注释器设置 StanfordCoreNLP 对象。
接下来,我们创建一个新的 Annotation 实例。最后,我们实现从示例句子生成令牌的逻辑。

6. CogComp NLP

CogComp NLP 是由认知计算组开发的自然语言处理(NLP)库集合。它提供了各种用于 NLP 任务的工具和模块,如分词、词形还原、词性标注等。

java 做人工智能 java人工智能教程_java_03


CogComp NLP 可以作为命令行工具或 Java API 使用。CogComp NLP 中的一个流行模块是 cogcomp-nlp-pipeline,它对给定文本执行基本的 NLP 任务。然而,cogcomp-nlp-pipeline 仅适用于英文的纯文本。

另一个模块是 similarity,它衡量文本或其他对象之间的相似性并返回一个分数。

7. GATE

General Architecture for Text Engineering(GATE)是一个能够解决文本分析和语言处理问题的工具包。它是开发用于处理人类语言的软件组件的强大基础设施。此外,它也是一个很好的 NLP 工具包。

java 做人工智能 java人工智能教程_java_04


这个工具包拥有大量的开发者和研究人员社区,他们使用它进行信息提取、情感分析、社交媒体挖掘和生物医学文本处理。

GATE 通过为语言处理软件提供架构来帮助开发人员和研究人员。此外,它还提供了实现该架构的类库。

8. Apache UIMA

无结构信息管理应用程序(UIMA)是能够处理和分析大量无结构数据(包括文本、音频和视频)的软件系统。它们有助于创建可以从内容中检测情感、实体和其他类型信息的组件。组件是用 Java 或 C++ 编写的。

java 做人工智能 java人工智能教程_人工智能_05


此外,Apache UIMA 是一个框架,使我们能够使用 UIMA 组件构建应用程序并处理大量无结构数据。它帮助我们从数据中提取相关信息,并将其用于各种目的。

9. MALLET

MAchine Learning for LangaugE Toolkit(MALLET)是一个 Java 软件包,提供了各种用于 NLP 任务的工具和算法,如文档分类、主题建模和序列标注。包括在 MALLET 中的一种算法是朴素贝叶斯算法,它在 NLP 中被广泛用于文本分类和情感分析。

java 做人工智能 java人工智能教程_java_06


MALLET 是一个开源的 Java 软件包,提供了各种文本分析工具。其中一个工具是主题建模,它可以发现大量未标记文本文档中的主要主题。

此外,MALLET 还可以将文本文档转换为可用于机器学习的数值向量。另外,它可以作为命令行工具或直接 Java API 使用。

10.结论

在本文中,我们了解了关于 NLP 的关键知识以及 NLP 的用例。此外,我们了解了不同的 Java NLP 库和工具包。此外,我们还分别使用 CoreNLP 和 OpenNLP 查看了分词和句子检测的示例。