Не удается заставить CJKAnalyzer/Tokenizer распознавать японский текст

Я работаю с 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? プ* будет работать, но プーケ* ничего не найдет.


person peteisace    schedule 06.01.2012    source источник
comment
какие версии Lucene.Net/Lucene.Net Contrib вы используете. Я только что протестировал последнюю версию пакета, доступного в NuGet, и он отлично работает с вашим вводом.   -  person Jf Beaulac    schedule 06.01.2012
comment
@Jf Beaulac - используя 2.9.   -  person peteisace    schedule 11.01.2012
comment
Я могу ответить на один из ваших вопросов: プーケット это Пхукет, город в Таиланде. :) А на другое ответить не могу.   -  person t_motooka    schedule 12.01.2012
comment
Небольшой комментарий о том, почему работает корейский язык: он работает, потому что в корейском языке, в отличие от китайского и японского, между словами используются пробелы. Однако он не использует его очень последовательно, например. могут быть длинные составные существительные или составные словосочетания без пробелов. Для них вам все равно следует использовать специальный токенизатор для корейского языка.   -  person jogojapan    schedule 05.03.2012


Ответы (1)


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

person Pradeep    schedule 19.09.2012