[英]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.