Solr: Использование фрагментатора Regex для извлечения абзацев - PullRequest
2 голосов
/ 13 декабря 2008

Я отправил это сообщение в список рассылки 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 лет. А также эти маленькие парни в конечном итоге получат намного больше. Они вырастут

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

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

Mark

Ответы [ 3 ]

3 голосов
/ 13 декабря 2008

Попробуйте:

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

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

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

И я не думаю, что .* как раз перед другим квантификатором ({400,600}) - хорошая идея, поэтому .{400,600}

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

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

1 голос
/ 13 декабря 2008

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

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

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

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

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

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

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

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

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

0 голосов
/ 28 июня 2011

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

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

...