簡體   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