Не мога да накарам 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. Но единственото безпокойство е за китайския символ. Той токенизира китайския език, но по 1 знак наведнъж.

person Pradeep    schedule 19.09.2012