Токенизация ключевых слов в Lucene.Net

Я использую Lucene.Net 2.9.2, и я считаю, что мне нужно будет написать собственный токенизатор, но я хотел проверить, если мне не хватает чего-то очевидного.

Документ состоит из заголовка, ключевых слов и содержимого, а также некоторых метаданных, таких как автор, дата и т. Д., Каждый из которых хранится в виде поля. Эти документы являются техническими документами по программному обеспечению и могут содержать такие фразы, как ".Net", "C ++", "C #" в названии, ключевых словах и / или содержании.

Я использую KeywordAnalyzer для поля Keyword и StandardAnalyzer для Title и Content - StopWords и LowerCase и т. Д. Необходимы, поскольку документы могут быть очень длинными.

Я также написал настраиваемый фильтр синонимов для поиска, поскольку я хочу искать, например, «C #», но также распознавать «CSharp», «C # .Net» и т. Д. Токенизатор уже удалил «#» из «C #». или '++' из C ++, и поэтому его можно спутать, скажем, со справочником языка 'C'

Я думаю, что когда я индексирую заголовок и контент, мне нужно разветвлять токенизацию в зависимости от того, является ли текущий токен частью ключевой фразы или любого из ее синонимов.

Это лучший подход? Спасибо заранее :)


person eslsys    schedule 14.11.2011    source источник


Ответы (2)


Я думаю, что вы можете использовать WhitespaceTokenizer, затем вставить KeywordMarkerFilter, чтобы пометить некоторые токены как «неприкосновенные» и, наконец, предоставить свой собственный фильтр, который удалял бы символы пунктуации. Может быть, кто-нибудь со знанием Lucene.Net что-нибудь подскажет; например в Solr можно использовать WordDelimiterFilter.

person Artur Nowak    schedule 14.11.2011
comment
Привет, Артур, спасибо за ответ. Я считаю / думаю, что KeywordMarkerFilter был представлен в Java API в версии 3.1 - в настоящее время он не поддерживается в .net, поскольку 2.9.2 является последней версией. Однако я думаю, что то, что вы предлагаете, - это то, о чем я думал, то есть имитировать это в .net с помощью специального токенизатора. Еще раз спасибо :) - person eslsys; 15.11.2011
comment
Вы правы, я отвечал на вопрос с точки зрения Lucene, надеюсь, что это поможет. - person Artur Nowak; 15.11.2011
comment
Спасибо, Артур, определенно полезно, поскольку помогает сузить потенциальные варианты моего подхода. Я оставлю вопрос открытым еще на несколько дней на случай, если у кого-то еще есть точка зрения. Еще раз спасибо - person eslsys; 15.11.2011

Настройку токенизатора можно выполнить с помощью одного из нижеперечисленных классов:

1). Lucene.Net.Analysis.CharTokenizer 2). Lucene.Net.Analysis.Tokenizer

public class AlphaNumbericTokenizer : Lucene.Net.Analysis.CharTokenizer
{
     public AlphaNumbericTokenizer (System.IO.TextReader input) : base(input)
     {
     }
     protected override bool IsTokenChar(char c)
     {
       //TODO: Logic for identifying token or token separator
       return char.IsLetterOrDigit(c);
     }
}

См. http://karticles.com/NoSql/lucene_custom_tokenizer.html

person vrluckyin    schedule 24.01.2012
comment
Я пошел немного другим путем в решении этой проблемы - я напишу об этом в сообщении в блоге и опубликую здесь ссылку с описанием решения. Спасибо за ответ vrluckyin :) - person eslsys; 23.02.2012