Solr: Использование фрагментатора Regex для извлечения абзацев

Я отправил это сообщение в список рассылки Solr, но я пытаюсь и здесь, на случай, если вокруг будет скрываться эксперт Solr.

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

<str name="hl.fragsize">500</str>
<str name="hl.fragmenter">regex</str>
<str name="hl.regex.slop">0.8</str>
<str name="hl.regex.pattern">[\w].*{400,600}[.!?]</str>
<str name="hl">true</str>
<str name="q">chinese</str>

Это должно соответствовать 400-600 символов, начиная с символа слова и заканчивая одним из.!?. Вот пример типичного результата:

, Проверьте эти картинки. В четверг на юго-западе Китая впервые демонстрируются девять панды. Им меньше года. Они только недавно перестали кормить грудью. В горных лесах центрального Китая осталось только 1600 человек, еще 120 в китайских питомниках и зоопарках. А им около 20, которые живут за пределами Китая в зоопарках. Они существуют почти полностью на бамбуке. Они могут дожить до 30 лет. И эти маленькие ребята со временем станут намного больше. Они будут расти

Как вы можете видеть, он начинается с точки и заканчивается на символе слова! Это почти так, как будто фрагменты просто выходят, как они будут, и регулярное выражение вообще ничего не делает, но результаты меняются, когда я использую фрагментатор разрыва. В приведенном выше результате я не вижу никакой причины, по которой он не должен был бы исключить предыдущий период и последние два слова, есть много места в пробое и в шаблоне регулярных выражений. Пожалуйста, помогите мне понять, что я делаю не так ...

Большое спасибо,

отметка

12.12.2008 22:01:41
Я добавил дополнительные рекомендации. Не могли бы вы применить их и сказать мне, если это работает лучше?
VonC 12.12.2008 23:41:31
Я знаю, что прошло 2,5 года, но вы когда-нибудь понимали это? У меня та же проблема, когда регулярное выражение вызывает результат, который начинается с точки, даже если это должно быть слово.
chaimp 12.05.2011 06:12:40
Нет, я так и не понял - удачи!
Markus 27.06.2011 23:04:48
3 ОТВЕТА
РЕШЕНИЕ

Пытаться:

\w[^\.!\?]{400,600}[\.!\?]

Вам не нужны первые квадратные скобки \w

И вы должны избежать последней точки.

И я не думаю, .*что еще до того, как другой квантификатор ( {400,600}) будет хорошей идеей, следовательно,.{400,600}

Так ?как это специальный символ в регулярном выражении, вы также должны избегать его.

И поскольку .соответствует чему-либо, вы должны использовать его [^\.!\?], чтобы соответствовать чему-либо, кроме ваших конечных символов.

3
12.12.2008 23:40:59
Привет, спасибо за ваш ответ. Вы правы. * {400,600} определенно была большой проблемой и ошибкой с моей стороны. Я применил ваши исправления, но, к сожалению, мои результаты все же не лучше. Но это определенно было частью проблемы, поэтому большое спасибо.
Markus 12.12.2008 23:24:57

Я никогда не слышал об инструменте, с которым вы работаете (Solr), но квантификаторы в вашем регулярном выражении определенно неверны. Это регулярное выражение будет соответствовать от 402 до 602 символов, где первый - это символ слова, а последний - один из трех знаков пунктуации:

\w.{400,600}[.!?]

Точка и знак вопроса не являются метасимволами внутри класса символов, поэтому нет смысла избегать их. \ w может стоять самостоятельно.

Поскольку точка также соответствует 3 знакам пунктуации, ваше регулярное выражение будет соответствовать максимально возможному количеству символов (до 602), а затем вернется, чтобы убедиться, что последний является одним из 3 знаков пунктуации.

Если вы хотите расставить приоритеты для более коротких прогонов, используйте ленивый квантификатор:

\w.{400,600}?[.!?]

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

\w[^.!?]{400,600}[.!?]

Все вышеперечисленное предполагает, что Solr использует регулярные выражения в стиле Perl. Такие вещи, как \ w и {400,600}, не работают во всех разновидностях регулярных выражений.

1
13.12.2008 12:55:24

Кажется, есть проблема, если вы используете WordDelimiterFilterFactory. Проблема описана здесь http://www.mail-archive.com/solr-user@lucene.apache.org/msg30631.html

Как описано в ссылке выше, одним из решений может быть добавление preserveOriginal="1"к вашему WordDelimiterFilterFactory. Я попробовал это, и это сработало для меня. Однако (будучи новичком в SOLR) я не знаю, есть ли какие-либо недостатки этого подхода (кроме увеличения размера индекса).

0
28.06.2011 08:58:46