2013-06-30 11 views
2

텍스트에서 일부 키워드를 추출하려고합니다. 그것은 아주 잘 작동하지만 복수형을 제거해야합니다.Lucene.NET에서 복수형을 제거하는 방법은 무엇입니까?

이미 Lucene을 검색 목적으로 사용하고 있으므로 색인화 된 용어로 키워드를 추출하는 데 사용하려고합니다. 나는 "대통령"과 같은 용어를 가질 수있는 용어 목록에서

var list = new List<KeyValuePair<int, string>>(); 
using (var reader = IndexReader.Open(directory, true)) 
{ 
    var tv = reader.GetTermFreqVector(0, "text"); 
    if (tv != null) 
    { 
     string[] terms = tv.GetTerms(); 
     int[] freq = tv.GetTermFrequencies(); 

     for (int i = 0; i < terms.Length; i++) 
      list.Add(new KeyValuePair<int, string>(freq[i], terms[i])); 
    } 
} 

:

첫째, 내가 지수에게 RAMDirectory 지수에서 문서, 그리고

RAMDirectory idx = new RAMDirectory(); 
using (IndexWriter writer = 
    new IndexWriter(
     idx, 
     new CustomStandardAnalyzer(StopWords.Get(this.Language), 
     Lucene.Net.Util.Version.LUCENE_30, this.Language), 
     IndexWriter.MaxFieldLength.LIMITED)) 
{ 
    writer.AddDocument(createDocument(this._text)); 
    writer.Optimize(); 
} 

, 나는 키워드를 추출 "회장"
어떻게 제거 할 수 있습니까?
내 CustomStandardAnalyzer이를 사용

public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
{ 
    //create the tokenizer 
    TokenStream result = new StandardTokenizer(this.version, reader); 

    //add in filters 
    result = new Lucene.Net.Analysis.Snowball.SnowballFilter(result, this.getStemmer()); 
    result = new LowerCaseFilter(result); 
    result = new ASCIIFoldingFilter(result); 
    result = new StopFilter(true, result, this.stopWords ?? StopWords.English); 

    return result; 
} 

그래서 내가 이미 (올바른 언어 별 형태소 분석기 사용) SnowballFilter를 사용합니다. 복수형은 어떻게 제거 할 수 있습니까?

+0

그것은 당신이 표시되지 않는 코드의 부분에서 뭔가해야 당신이 당신이 포터 형태소 분석기 사용하는 경우 우리가 작업을해야 보여 . 나는 기본적으로 당신의 코드를 몇개의 하드 코드 된 (스템 머) 재료와 함께 넣을 것이다. –

답변

2

다음 프로그램에서 내 출력은 다음과 같습니다

text:and 
text:presid 
text:some 
text:text 
text:with 
class Program 
{ 
    private class CustomStandardAnalyzer : Analyzer 
    { 
     public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
     { 
      //create the tokenizer 
      TokenStream result = new StandardTokenizer(Lucene.Net.Util.Version.LUCENE_30, reader); 
      //add in filters 
      result = new Lucene.Net.Analysis.Snowball.SnowballFilter(result, new EnglishStemmer()); 
      result = new LowerCaseFilter(result); 
      result = new ASCIIFoldingFilter(result); 
      result = new StopFilter(true, result, new HashSet<string>()); 
      return result; 
     } 
    } 

    private static Document createDocument(string text) 
    { 
     Document d = new Document(); 
     Field f = new Field("text", "", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); 
     f.SetValue(text); 
     d.Add(f); 
     return d; 
    } 

    static void Main(string[] args) 
    { 

     RAMDirectory idx = new RAMDirectory(); 
     using (IndexWriter writer = 
      new IndexWriter(
       idx, 
       new CustomStandardAnalyzer(), 
       IndexWriter.MaxFieldLength.LIMITED)) 
     { 
      writer.AddDocument(createDocument("some text with president and presidents")); 
      writer.Commit(); 
     } 

     using (var reader = IndexReader.Open(idx, true)) 
     { 
      var terms = reader.Terms(new Term("text", "")); 
      if (terms.Term != null) 
       do 
        Console.WriteLine(terms.Term); 
       while (terms.Next()); 
     } 
     Console.ReadLine(); 

    } 
} 
+0

도움 주셔서 감사합니다. 문제는 키워드를 검색하고 "presid"가 키워드가 아니며 "president"를 반환해야한다는 것입니다. 나는 SnowballFilter를 사용해 보았지만 복수형을 제거하는 것과는 다른 단어를 사용하고있다. 키워드는 사용자가 볼 수 있기 때문에 기존 단어 여야합니다. – Fabske

+0

아, 이제 알았습니다. 그런 일이 이미 .NET에서는 끝났지 만 Solr (java)에는 solr.EnglishMinimalStemFilterFactory가 있습니다. 복수형 만 처리하는 형태소 분석기입니다. –

+0

이 클래스의 코드 소스를 살펴보고 확인합니다. 나는 그것을 C#으로 변환 할 수있다. 나는 또한 C에서 다른 복수형 제거제 코드를 발견했다. 하지만 둘 다 영어 전용이고 패키지는 적어도 3 개 언어 (en, fr, nl)를 지원해야합니다. – Fabske