我正在使用apache开发一个文本分析项目。我需要归纳一些文本(将单词转换成它们的规范形式)。我已经写了生成词干的代码。使用它,我能够转换以下句子
词干是单词的一部分,即使在形态变化时也不会改变;引理是单词的基本形式。例如,从“生产”,引理是“生产”,但茎是“生产-”。这是因为有诸如生产这样的词汇
转到
词干部分词,即使是当词根变形引理基时,也不会改变,因为词积是从引理到引理,从引理到词干,就形成了词法检验。
但是,我需要得到单词的基本形式:示例而不是exampl,产生而不是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 (尽管以它自己的方式),它绝对值得探索。
发布于 2020-05-26 23:46:48
如果有人还需要它,我决定回到这个问题,并说明如何使用我前面找到的乡土形态库来对英语和俄语进行柠檬化。
首先,您将需要这些依赖关系 (除了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>然后,确保导入正确的分析器:
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的实现(如果您对如何做到这一点感兴趣,请告诉我,我将详细说明这一点)。
希望能帮上忙,祝你好运!
发布于 2018-03-17 15:18:29
是的,StanfordNLP对英语很有好处。但是如果您需要支持几种语言,我可以推荐您Freeling,检查它的演示,请选择language和output (用于柠檬化的形态分析)。我不会说俄语,但我认为它适用于这篇文章:
Продолжаюциклпостовобастрологииинауке。Астрологиянеимеетнаучногообоснования,ноявляетсячастьюисториинауки,частьюкультурыиобщественногосознания。Поэтомуастрологическийвзгляднанаукувесьмаинтересен。
为了机器可读性,您可以使用xml输出(在结果下面),对于自动化,您可以将Freeling与python/java集成,但通常我更喜欢通过命令行调用它。
https://stackoverflow.com/questions/47725035
复制相似问题