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