Не удается получить CJKAnalyzer / Tokenizer для распознавания японского текста - PullRequest
0 голосов
/ 06 января 2012

Я работаю с Lucene.NET, и это здорово. затем работал над тем, как заставить его искать азиатские языки. поэтому я перешел от StandardAnalyzer к CJKAnalyzer.

это прекрасно работает для корейского (хотя StandardAnalyzer нормально работал для корейского!) И китайского (который не работал), но я все еще не могу заставить программу распознавать японский текст.

в качестве очень маленького примера я пишу крошечную базу данных (используя CJKAnalyzer) с несколькими словами, а затем пытаюсь прочитать из базы данных:

public void Write(string text, AnalyzerType type)
        {
            Document document = new Document();

            document.Add(new Field(
                "text",
                text,
                Field.Store.YES,
                Field.Index.ANALYZED));

            IndexWriter correct = this.chineseWriter;
            correct.AddDocument(document);            
        }

это для написания. и для чтения:

public Document[] ReadMultipleFields(string text, int maxResults, AnalyzerType type)
        {
            Analyzer analyzer = this.chineseAnalyzer;

            QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer);
            var query = parser.Parse(text);                        

            // Get the fields.
            TopFieldCollector collector = TopFieldCollector.create(
                new Sort(),
                maxResults,
                false,
                true,
                true,
                false);

            // Then use the searcher.            
            this.searcher.Search(
                query,
                null,
                collector);

            // Holds the results
            List<Document> documents = new List<Document>();

            // Get the top documents.
            foreach (var scoreDoc in collector.TopDocs().scoreDocs)
            {
                var doc = this.searcher.Doc(scoreDoc.doc);
                documents.Add(doc);
            }

            // Send the list of docs back.
            return documents.ToArray();
        }

, где ChineseWriter - это просто IndexWriter с переданным CJKAnalyzer, а chineseAnalyzer - это просто CJKAnalyzer.

любой совет, почему японский язык не работает? входные данные, которые я посылаю, кажутся справедливыми:

プ ー ケ ッ ト

это то, что я буду хранить, но не могу прочитать. (

РЕДАКТИРОВАТЬ: Я был не прав ... Китайский на самом деле тоже не работает: если поисковый термин длиннее 2 символов, он перестает работать. То же, что и японец.

РЕДАКТИРОВАТЬ ЧАСТЬ 2: Теперь я видел, что проблема заключается в использовании поиска по префиксу. Если я ищу первые 2 символа и использую звездочку, это работает. Как только я перехожу через 2, он перестает работать. Я думаю, это из-за того, как слово токенизировано? Если я ищу полный термин, он находит его. Есть ли в любом случае использовать поиск префикса в Lucene.NET для CJK? Will * будет работать, но プ ー ケ * ничего не найдет.

1 Ответ

0 голосов
/ 20 сентября 2012

Я использую StandardTokenizer. По крайней мере, для текста на японском и корейском языках, он может маркировать слова, содержащие 3 или 4 символа. Но беспокойство вызывает только китайский символ. Он делает токенизацию китайского языка, но по одному символу за раз.

...