Подсчет предложений: база данных (например, h2) против Lucene против? - PullRequest
2 голосов
/ 15 февраля 2010

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

У меня была идея разбить эти предложения на слова и сохранить их в базе данных, где столбцы будут позициями (word-1, word-2, word-3..etc), а предложения - строк. Так это выглядит:

Word1 Word2 Word3 Word4 Word5 ....

Конгресс одобрил новый законопроект

Джон пошел в школу

.....

И тогда моя цель будет выполнена, вызвав что-то вроде COUNT (SELECT *, где Word1 = Джон и Word4 = школа). Но мне интересно: может ли это быть лучше достигнуто с помощью Lucene (или другого инструмента)?

Программа, которую я пишу (на Java), будет выполнять десятки тысяч таких запросов в этом 100-миллионном корпусе предложений. Так что скорость поиска важна.

Спасибо за любой совет,

Anas

Ответы [ 6 ]

1 голос
/ 17 февраля 2010

Lucene span запросов может реализовывать позиционный поиск. Используйте SpanFirst , чтобы найти слово в первых N позициях документа, и объедините его с SpanNot , чтобы исключить первый N-1.

Ваш пример запроса будет выглядеть так:

<BooleanQuery: +(+spanFirst(john, 1) +spanFirst(went, 2)) +spanNot(spanFirst(hospital, 5), spanFirst(hospital, 4))>

Lucene также, конечно, позволяет получить общее количество попаданий в результате поиска без итерации всех документов.

1 голос
/ 16 февраля 2010

Полагаю, у вас уже есть инфраструктура для создания токенов из данного предложения. Вы можете создать документ Lucene с одним полем для каждого слова в предложении. Вы можете назвать поля как field1, field2, и так далее. Поскольку в lucene нет схемы, подобной DB, вы можете определять на лету столько полей, сколько пожелаете. Вы можете добавить дополнительное поле идентификатора, если хотите определить, какие предложения соответствуют запросу.

Во время поиска ваш типичный запрос на lucene будет

+field1:John +field4:school

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

Поскольку вы не планируете извлекать обратно совпадающие предложения или слова, вам следует только индексировать эти поля, а не хранить. Это должно повысить производительность на ступеньку выше.

1 голос
/ 16 февраля 2010

Если предположить, что запросы так же просты, как вы указали, для этого идеально подойдет простая база данных SQL (Postgres, MySQL, возможно, H2).

0 голосов
/ 16 февраля 2010
  • Я предлагаю вам прочитать Поисковая система и СУБД . Из того, что я понял, вам нужна база данных, а не библиотека полнотекстового поиска.
  • В любом случае, я предлагаю вам предварительно обработать ваш текст и заменить каждое слово / токен на число, используя словарь. Это заменяет каждое предложение массивом кодов слов. Затем я бы сохранял каждое слово в отдельном столбце базы данных, упрощая счет и делая их быстрее. Например:

Мальчик и девочка пили молоко

переводится на:

120 530 14 120 619 447 253

(я выбрал произвольные коды слов), ведущий к сохранению строки

120 530 14 120 619 447 253 0 0 0 0 0 0 0 ....

(до тех пор, пока не будет исчерпано количество слов, выделяемых вами в предложении).

Это несколько разреженная матрица , так что, возможно, этот вопрос поможет.

0 голосов
/ 16 февраля 2010

Или вы можете сделать это вручную, используя только java

List triple = new ArrayList(3);    
for (String word: inputFileWords) {
  if (triple.size == 3) {
      resultFile.println(StringUtils.join(" ", triple));
      triple.remove(0);
  }
  triple.add(line);
}

затем сортируйте этот файл и суммируйте все повторяющиеся строки (вручную или из какой-либо утилиты командной строки), это будет максимально быстро

0 голосов
/ 15 февраля 2010

Посмотрите на Apache Hadoop и Map Reduce. Он разработан для таких вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...