用apache lucene进行词形还原

Kir*_*nov 7 java lucene nlp stemming lemmatization

我正在使用apache lucene开发一个文本分析项目.我需要对一些文本进行引理(将单词转换为规范形式).我已经编写了代码来制作词干.使用它,我能够转换下面的句子

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

即使形态学变形引理基础形式单词例子来自产品引理产品干产品因为字产品

不过,我需要的话基本形式:例如,而不是为例,产生的替代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();
Run Code Online (Sandbox Code Playgroud)

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

Kir*_*nov 2

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

\n

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

\n
<!-- if you need Russain -->\n<dependency>\n    <groupId>org.apache.lucene.morphology</groupId>\n    <artifactId>russian</artifactId>\n    <version>1.1</version>\n</dependency>\n\n<!-- if you need English-->\n<dependency>\n    <groupId>org.apache.lucene.morphology</groupId>\n    <artifactId>english</artifactId>\n    <version>1.1</version>\n</dependency>\n\n<dependency>\n    <groupId>org.apache.lucene.morphology</groupId>\n    <artifactId>morph</artifactId>\n    <version>1.1</version>\n</dependency>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
import org.apache.lucene.morphology.english.EnglishAnalyzer;\nimport org.apache.lucene.morphology.russian.RussianAnalyzer;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
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";\nAnalyzer analyzer = new EnglishAnalyzer();\nTokenStream stream = analyzer.tokenStream("field", text);\nstream.reset();\nwhile (stream.incrementToken()) {\n    String lemma = stream.getAttribute(CharTermAttribute.class).toString();\n    System.out.print(lemma + " ");\n}\nstream.end();\nstream.close();\n
Run Code Online (Sandbox Code Playgroud)\n

它会打印

\n
\n

词干是单词的一部分,即使在形态上屈折词尾变化时也不会改变\n是词的基本形式\n例如从产生的产生产生引理是产生但词干是\n产生这个是因为有这样的单词作为生产

\n
\n

对于俄语文本

\n
String text = "\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb4\xd0\xbe\xd0\xbb\xd0\xb6\xd0\xb0\xd1\x8e \xd1\x86\xd0\xb8\xd0\xba\xd0\xbb \xd0\xbf\xd0\xbe\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2 \xd0\xbe\xd0\xb1 \xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd0\xb8 \xd0\xb8 \xd0\xbd\xd0\xb0\xd1\x83\xd0\xba\xd0\xb5. \xd0\x90\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f \xd0\xbd\xd0\xb5 \xd0\xb8\xd0\xbc\xd0\xb5\xd0\xb5\xd1\x82 \xd0\xbd\xd0\xb0\xd1\x83\xd1\x87\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe \xd0\xbe\xd0\xb1\xd0\xbe\xd1\x81\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f, \xd0\xbd\xd0\xbe \xd1\x8f\xd0\xb2\xd0\xbb\xd1\x8f\xd0\xb5\xd1\x82\xd1\x81\xd1\x8f \xd1\x87\xd0\xb0\xd1\x81\xd1\x82\xd1\x8c\xd1\x8e \xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xbd\xd0\xb0\xd1\x83\xd0\xba\xd0\xb8, \xd1\x87\xd0\xb0\xd1\x81\xd1\x82\xd1\x8c\xd1\x8e \xd0\xba\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x83\xd1\x80\xd1\x8b \xd0\xb8 \xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd0\xb5\xd0\xbd\xd0\xbd\xd0\xbe\xd0\xb3\xd0\xbe \xd1\x81\xd0\xbe\xd0\xb7\xd0\xbd\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f. \xd0\x9f\xd0\xbe\xd1\x8d\xd1\x82\xd0\xbe\xd0\xbc\xd1\x83 \xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x87\xd0\xb5\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xb2\xd0\xb7\xd0\xb3\xd0\xbb\xd1\x8f\xd0\xb4 \xd0\xbd\xd0\xb0 \xd0\xbd\xd0\xb0\xd1\x83\xd0\xba\xd1\x83 \xd0\xb2\xd0\xb5\xd1\x81\xd1\x8c\xd0\xbc\xd0\xb0 \xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd1\x80\xd0\xb5\xd1\x81\xd0\xb5\xd0\xbd.";\n
Run Code Online (Sandbox Code Playgroud)\n

RussianAnalyzer打印以下内容:

\n
\n

\xd0\xbf\xd1\x80\xd0\xbe\xd0\xb4\xd0\xbe\xd0\xbb\xd0\xb6\xd0\xb0\xd1\x82\xd1\x8c \xd1\x86\xd0\xb8\xd0 \xba\xd0\xbb \xd0\xbf\xd0\xbe\xd1\x81\xd1\x82 \xd0\xbe\xd0\xb1 \xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe \xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f \xd0\xb8 \xd0\xbd\xd0\xb0\xd1\x83\xd0\xba\xd0\xb0 \xd0\xb0\xd1 \x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x8f\xd0\xbd\xd0\xb5\xd0\xb8\xd0\xbc \xd0\xb5\xd1\x82\xd1\x8c \xd0\xbd\xd0\xb0\xd1\x83\xd1\x87\xd0\xbd\xd1\x8b\xd0\xb9\n\xd0\xbe\xd0\xb1 \xd0\xbe\xd1\x81\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xbd\xd0\xbe\xd1\x8f\xd0 \xb2\xd0\xbb\xd1\x8f\xd1\x82\xd1\x8c\xd1\x81\xd1\x8f \xd1\x87\xd0\xb0\xd1\x81\xd1\x82\xd1\x8c \xd1\x87 \xd0\xb0\xd1\x81\xd1\x82\xd1\x8c\xd1\x8e \xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd0\xb8\xd1\x8f \xd0 \xbd\xd0\xb0\xd1\x83\xd0\xba\xd0\xb0 \xd1\x87\xd0\xb0\xd1\x81\xd1\x82\xd1\x8c \xd1\x87\xd0\xb0\xd1\x81 \xd1\x82\xd1\x8c\xd1\x8e\n\xd0\xba\xd1\x83\xd0\xbb\xd1\x8c\xd1\x82\xd1\x83\xd1\x80\xd0\xb0\xd0\xb8 \xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd1\x81\xd1\x82\xd0\xb2\xd0\xb5\xd0\xbd\xd0\xbd\xd1\x8b\xd0\xb9\xd1 \x81\xd0\xbe\xd0\xb7\xd0\xbd\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5\xd0\xbf\xd0\xbe\xd1\x8d\xd1\x82\xd0\xbe \xd0\xbc\xd1\x83 \xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd0\xb8\xd1\x87\xd0 \xb5\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xb2\xd0\xb7\xd0\xb3\xd0\xbb\xd1\x8f\xd0\xb4 \xd0\xbd\xd0\xb0 \n\xd0\xbd\xd0\xb0\xd1\x83\xd0\xba\xd0\xb0 \xd0\xb2\xd0\xb5\xd1\x81\xd1\x8c\xd0\xbc\xd0\xb0 \xd0\xb8 \xd0\xbd\xd1\x82\xd0\xb5\xd1\x80\xd0\xb5\xd1\x81\xd0\xbd\xd1\x8b\xd0\xb9

\n
\n

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

\n

希望它有帮助,祝你好运!

\n