2016-11-15 3 views
1

У меня есть веб-приложение, которое позволяет пользователям загружать текстовые документы (около 2-3000 слов) и таблицу базы данных с примерно 50 000 фраз (в виде строк).Найти фразы в одном документе

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

Поток веб-приложений в идеале должен быть таким, чтобы при загрузке страницы после загрузки приложение узнало, какие фразы он нашел в этом документе.

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

+2

Вам нужно проверить это более одного раза? – Stefan

+0

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

+0

@ Вопрос Стефана наиболее уместен. Если вам нужно сделать это только один раз, перетащите его и назовите его днем. Если учесть это, еще один уместный вопрос: насколько велик ваш документ? Для небольшого документа (например, «Комедия ошибок Шекспира») лучший подход может отличаться от большого документа (например, полные произведения Шекспира). –

ответ

0

Я не знаю, что база данных вы используете, так что я просто дать решение MySQL:

require 'mysql2' 

content = File.read('/path/to/document.txt') 

client = Mysql2::Client.new(:host => "localhost", :username => "root") 

sql = "SELECT phrase FROM phrases ORDER BY LENGTH(phrase)" 

appeared = client.query(sql, as: :array, stream: true).each.with_object([]) do |row, array| 
    array << row[0] if content.gsub!(%r[#Regexp.escape(row[0])]i, '') 
end 

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не проверено.

+0

@SergioTulentsev Спасибо. Я просто изменил его на 'String # gsub!' – Aetherus

Смежные вопросы