Добавление тегов к именам с использованием lucene / java

У меня есть имена всех сотрудников моей компании (5000+). Я хочу написать движок, который может на лету находить имена в онлайн-статьях (блогах / вики / справочных документах) и помечать их тегом «mailto» в электронной почте пользователя.

На данный момент я планирую удалить все стоп-слова из статьи, а затем искать каждое слово в люценовом индексе. Но даже в этом случае я вижу много запросов, попадающих в индексы, например, если есть статья с 2000 словами и только двумя ссылками на имена людей, то, скорее всего, будет 1000 запросов lucene.

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


person Sap    schedule 31.08.2011    source источник
comment
Я не уверен, что подписываюсь, разве список сотрудников не определен заранее? разве эти имена не ваши вопросы?   -  person amit    schedule 31.08.2011
comment
@amit список сотрудников 5000, вы спрашиваете, нужно ли мне искать каждое имя в статье? 5000 запросов в документе 2000 слов? Я думал о другом.   -  person Sap    schedule 31.08.2011
comment
у вас только один документ? если вы это сделаете, lucene вам не сильно поможет ..   -  person amit    schedule 31.08.2011
comment
@amit nope у меня много документов, я использую в качестве примера один документ. Но я хочу делать это на лету. Это означает, что когда пользователь набирает свою вики в области предварительного просмотра, он должен на лету пометить имя с адресом электронной почты.   -  person Sap    schedule 31.08.2011
comment
Если я правильно понимаю, то, что вы хотели бы сделать, это выполнить поиск в своем списке имен терминов, которые люди вводят, чтобы вы могли предложить им адреса электронной почты и т. Д., Когда текст, который они набирают, является именем человека в вашем коллекция. Это правильно?   -  person Gene Golovchinsky    schedule 01.09.2011
comment
@Gene Golovchinsky ты прав   -  person Sap    schedule 01.09.2011


Ответы (2)


http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm
Этот алгоритм может быть вам полезен. Это будет работать следующим образом: вы сначала скомпилируете весь список имен в гигантский конечный автомат (что, вероятно, займет некоторое время), но затем, как только этот конечный автомат будет построен, вы можете пропустить его через столько документов, сколько захотите, и довольно эффективно обнаруживает имена.
Я думаю, что он будет рассматривать каждый символ в каждом документе только один раз, поэтому это должно быть намного эффективнее, чем токенизация документа и сравнение каждого слова со списком известных имен.
Есть куча реализаций, доступных для разных языков в сети. Проверить это.

person Aditya Mukherji    schedule 01.09.2011
comment
Я думаю, он пытается на лету обрабатывать вводимые пользователем данные, чтобы найти теги. Не похоже, что он пытается делать пакетную разметку. - person Gene Golovchinsky; 02.09.2011
comment
Это имеет смысл. Я запускаю асинхронную задачу каждые пять секунд, чтобы сделать разметку. Ваш ответ полезен. Большое спасибо - person Sap; 02.09.2011

Если у вас всего 5000 имен, я бы просто вставил их в хеш-таблицу в памяти, вместо того, чтобы возиться с Lucene. Вы можете хэшировать их несколькими способами (например, псевдонимами, первым-последним или последним-первым и т. Д.), При этом сохраняя относительно небольшой объем памяти и действительно эффективную производительность.

person Gene Golovchinsky    schedule 01.09.2011
comment
Нет, у меня гораздо больше имен, для простоты я использовал число 5000, на самом деле они намного больше. - person Sap; 01.09.2011
comment
Хорошо, но когда вы задаете вопрос, предоставьте достаточно информации для соответствующего ответа. Удерживаясь, вы зря тратите время. Не могли бы вы описать реальную проблему, которую вы пытаетесь решить? - person Gene Golovchinsky; 01.09.2011
comment
Причина, по которой я вынужден утаивать некоторую информацию, заключается в том, что я работаю в компании и не могу подробно рассказать о том, над чем я работаю. Что касается вопроса, то точное число 99655, которое со временем будет увеличиваться. Предполагая, что я храню каждое из них в HashMap, вы предлагаете искать в hashMap каждое слово статьи? - person Sap; 01.09.2011
comment
Хорошо, допустим, ваша компания преуспевает и за следующие три года увеличится вдвое (есть работа?), Так что теперь у вас 200 000 сотрудников. Большинство ваших людей из Таиланда, и у них 100-буквенные фамилии и имена (вместе взятые). Пренебрегая размером ключа, это означает, что ваша хеш-таблица составляет 200 КБ * 0,1 КБ = 20 МБ. Это легко вписывается в любую разумную машину. Затем вы можете найти все, что захотите, в постоянное время: не может быть более эффективного, чем это. - person Gene Golovchinsky; 01.09.2011
comment
(продолжение) Если вы беспокоитесь о загрузке данных, если вам нужны данные на нескольких машинах и т. д., я предлагаю вам взглянуть на хранилище ключей и значений, такое как Redis. Но я не думаю, что у вас так много данных, чтобы они не подходили для основной памяти на современных машинах. - person Gene Golovchinsky; 01.09.2011
comment
отлично, я могу использовать сериализацию карты и десериализацию, когда это необходимо. Но последний вопрос, следует ли мне нажимать на карту для каждого слова статьи? Нет ли способа уменьшить количество слов для поиска? Единственный способ удалить стоп-слова? - person Sap; 01.09.2011