繁体   English   中英

使用 apache lucene 进行词形还原

[英]Lemmatization with apache lucene

我正在使用 apache lucene 开发一个文本分析项目。 我需要对一些文本进行词形还原(将单词转换为其规范形式)。 我已经编写了进行词干提取的代码。 使用它,我可以转换以下句子

词干是词的一部分,即使在形态变化时也不会改变; 引理是单词的基本形式。 例如,从“生产”,引理是“生产”,但词干是“生产-”。 这是因为有生产等词

进入

词干部分词永远不会改变,即使形态学从 produc lemma produc 词干 produc 因为词产品而变形引理基础形式词示例

不过,我需要的话基本形式:例如,代替为例产生的替代produc,等等。

我使用 lucene 是因为它有多种语言的分析器(我至少需要英语和俄语)。 我知道斯坦福 NLP库,但它没有俄语支持。

那么有没有办法像我使用 lucene 做词干那样对几种语言进行词形还原?

我负责词干提取的代码的简化版本:

//Using apache tika to identify the language
LanguageIdentifier identifier = new LanguageIdentifier(text);
//getting analyzer according to the language (eg, EnglishAnalyzer for 'en')
Analyzer analyzer = getAnalyzer(identifier.getLanguage());
TokenStream stream = analyzer.tokenStream("field", text);
stream.reset();
while (stream.incrementToken()) {
    String stem = stream.getAttribute(CharTermAttribute.class).toString();
    // doing something with the stem
    System.out.print(stem+ " ");
}
stream.end();
stream.close();

更新:我发现该几乎可以满足我的需求(针对英语和俄语)并使用 apache lucene(尽管以自己的方式),它绝对值得探索。

如果有人仍然需要它,我决定回到这个问题并说明如何使用我之前找到的russianmorphology库来对英语和俄语进行词形还原。

首先,您将需要这些依赖项(除了lucene-core ):

<!-- if you need Russain -->
<dependency>
    <groupId>org.apache.lucene.morphology</groupId>
    <artifactId>russian</artifactId>
    <version>1.1</version>
</dependency>

<!-- if you need English-->
<dependency>
    <groupId>org.apache.lucene.morphology</groupId>
    <artifactId>english</artifactId>
    <version>1.1</version>
</dependency>

<dependency>
    <groupId>org.apache.lucene.morphology</groupId>
    <artifactId>morph</artifactId>
    <version>1.1</version>
</dependency>

请注意,这些工件位于 CUBA 存储库 ( https://dl.bintray.com/cuba-platform/main/ )。

然后,确保导入正确的分析器:

import org.apache.lucene.morphology.english.EnglishAnalyzer;
import org.apache.lucene.morphology.russian.RussianAnalyzer;

这些分析器与标准的 lucene 分析器不同,它们使用MorphologyFilter将每个单词转换为其一组正常形式。

所以如果你使用下面的代码

String text = "The stem is the part of the word that never changes even when morphologically inflected; a lemma is the base form of the word. For example, from \"produced\", the lemma is \"produce\", but the stem is \"produc-\". This is because there are words such as production";
Analyzer analyzer = new EnglishAnalyzer();
TokenStream stream = analyzer.tokenStream("field", text);
stream.reset();
while (stream.incrementToken()) {
    String lemma = stream.getAttribute(CharTermAttribute.class).toString();
    System.out.print(lemma + " ");
}
stream.end();
stream.close();

它会打印

词干是词的一部分,即使在形态上屈折时也不会改变 引理是词的基本形式,例如来自生产的生产 词干是生产但词干是生产 这是因为有生产这样的词

对于俄文文本

String text = "Продолжаю цикл постов об астрологии и науке. Астрология не имеет научного обоснования, но является частью истории науки, частью культуры и общественного сознания. Поэтому астрологический взгляд на науку весьма интересен.";

RussianAnalyzer将打印以下内容:

продолжатьциклпостобастрологияинаукаастрологиянеиметьнаучныйобоснованиеноявлятьсячастьчастьюисториянаукачастьчастьюкультураиобщественныйсознаниепоэтомуастрологическийвзгляднанаукавесьмаинтересный

你可能会注意到有些词有不止一种基本形式,例如inflected被转换为[inflected, inflect] 如果您不喜欢这种行为,则必须更改org.apache.lucene.morphology.analyzer.MorhpologyFilter的实现(如果您对具体操作方法感兴趣,请告诉我,我将详细说明)这个)。

希望能帮到你,祝你好运!

是的,StanfordNLP 非常适合英语。 但是如果你需要支持多种语言我可以推荐你Freeling ,检查它的Freeling_online_demo ,请选择语言和输出(词形分析的词形分析)。 我不会说俄语,但我认为它适用于本文:

Продолжаю цикл постов об астрологии и науке。 Астрология не имеет научного обоснования, но является частью истории науки, частью культуры новасть Поэтому астрологический взгляд на науку весьма интересен。

为了机器可读性,您可以使用 xml 输出(在您的结果下方),为了自动化,您可以将 Freeling 与 python/java 集成,但通常我更喜欢通过命令行调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM