使用apache lucene进行词形还原

时间:2017-12-09 03:29:19

标签: java lucene nlp stemming lemmatization

我正在使用apache lucene开发文本分析项目。我需要对一些文本进行引理(将这些文字转换为它们的规范形式)。我已经编写了干预代码。使用它,我能够转换以下句子

  

词干是这个词的一部分,即使在形态上变化时也不会改变;引理是这个词的基本形式。例如,来自"产生",引理是"产生",但干是" produc - "。这是因为有生产等词语

  

词干部分词永远不会改变甚至当形态学变形引理基础形式词例子从产品引理产品词干产品因为词产品

但是,我需要获取单词的基本形式: example 而不是 exampl 生成而不是 produc < / em>,等等。

我正在使用lucene,因为它有多种语言的分析器(我至少需要英语和俄语)。我知道Stanford 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("filed", 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();

更新:我发现library几乎可以满足我的需求(英语和俄语)并使用apache lucene(虽然以自己的方式),但是绝对值得探索。

2 个答案:

答案 0 :(得分:1)

是的,StanfordNLP对英语有好处。但是,如果您需要支持多种语言,我可以向您推荐 Freeling ,查看其Freeling_online_demo,请选择语言和输出(形态分析以进行词形化)。我不会说俄语,但我认为它适用于本文:

  

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

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

答案 1 :(得分:0)

万一有人仍然需要它,我决定回到这个问题,并说明如何使用我先前发现的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将打印以下内容:

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

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

希望有帮助,祝您好运!