Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса"
1. Поиск фраз в документах
РСЯ
Дмитрий Агафонов
Я.Субботник, Москва, 18 апреля 2009 года
2. Яндекс – много разных поисков.
Для пользователей.
А ещё есть внутренние поиски.
Их тоже много.
Сегодня – про один из них.
Подробно!
2
3. Наш план
● О чём речь
● Кому это интересно
● Много букв (картинки будут)
● Ваши вопросы
● Мои ответы
3
4. О чём
Контекстная реклама: клиенты и площадки.
Клиенты дают рекламу.
Площадки дают место.
От клиентов – рекламные материалы. Много.
От площадок – документы в Интернете. Очень много.
Надо связать их эффективно. И быстро.
4
5. О чём
Процесс привязки большой и сложный.
Одна из задач – найти фразу в документе и определить
её релевантность.
Несколько миллионов фраз. Надо найти все!
Время на размышление для одного документа: 20ms.
Как это сделать?
5
6. О чём
У нас это решение нашей конкретной задачи.
Общие применения алгоритма:
● Поиск коллекции наборов объектов во множестве
объектов
● Определение релевантности данных заданным
признакам
● Классификация
● Обратный поиск
6
7. Кому интересно
● Разработчикам
● Менеджерам
● Алгоритмистам
● И мне тоже
Тем, кто решал подобную задачу или будет решать.
7
11. Вроде всё просто
● Есть много фраз
● Есть один документ
Найти фразы в документе.
Посчитать их релевантность.
11
12. На входе ⇐
Коллекция фраз. Фраза это:
– Множество слов
– Дополнительные условия
Документ это:
– Большое множество слов
● Позиция слова
● Вес слова
– Дополнительные условия
12
13. На выходе ⇒
Найденные фразы + релевантность каждой фразы.
Фраза найдена если:
– Документ содержит все слова фразы
– Слова фразы находятся недалеко друг от друга
– Дополнительные условия фраз и документа
соответствуют
Порядок слов не важен.
13
14. Пример на буквах
Это две фразы:
● ach
● dfpu
Это документ: a b c d e f g h i j k l m n o p q r s t u v w x y z
Нашли.
Но фраза d f p u слишком размазана по документу.
14
16. Две части решения
● Собрать фразы в индекс
● Обработать документ
А сначала пара особенностей.
16
17. «Людям» = «человеку»
Посимвольно «людям» ≠ «человеку».
Есть леммер!
У слова несколько форм
Основная – Лемма
Иногда не одна
неизвестный японский автор
«людям» (люди, человек)
«человеку» (человек)
Набор лемм слова – каноническая форма слова.
Или далее просто «слово».
17
18. Два приёма
● Сделать всё числами
– Слова
– Леммы
– Фразы
– Всё остальное
● Все числа упорядочить
18
20. На входе ⇐
Коллекция фраз. Фраза это:
– Множество слов
Документ это:
– Большое множество слов
● Позиция слова
● Вес слова
20
21. Этапы сборки индекса
● Подготовить фразы
● Построить индекс
Всего 11 простых действий :-)
21
22. Фразы
● Берём слова фраз
«c a b»
«b a»
«a c»
«b e d»
22
23. Фразы
● Берём слова фраз
● Считаем частоты слов
«c a b» a–3
«b a» b–3
«a c» c–2
«b e d» d–1
e–1
23
24. Фразы
● Берём слова фраз
● Считаем частоты слов
● Переставляем слова во фразах по убыванию частоты
«c a b» a–3 «a b c»
«b a» b–3 «a b»
«a c» c–2 «a c»
«b e d» d–1 «b d e»
e–1
24
27. Индекс
Красим узлы по типам
ii i
b c
i. «a b c» a
ii. «a b»
iii
iii. «a c» c
iv. «b d e»
b
iv
d e
корневой терминальный остальные
27
28. Индекс
Проводим вертикальные
уровни b
ii
c
i
i. «a b c» a
ii. «a b»
ii
iii. «a c» c
iv. «b d e»
b i
iv
d e
корневой терминальный остальные
28
29. Индекс
Нумеруем узлы слева
направо и сверху вниз 3 b
ii 6
c
i
i. «a b c» 1 a
ii. «a b»
iii
iii. «a c» 0 4 c
iv. «b d e»
2 b
7 iv
5 d e
корневой терминальный остальные
29
30. Индекс
Запоминаем диапазоны
номеров дочерних узлов 3 ii 6 i
6 b c
1
i. «a b c»
3-4 a
ii. «a b»
iii
0 4 c
iii. «a c» 1-2
iv. «b d e»
2 b
5
7 iv
5 d e
7
корневой терминальный остальные
30
31. Индекс
Делаем таблицу
Слово → Узлы дерева 3 ii 6 i
6 b c
1
i. «a b c»
3-4 a
ii. «a b»
iii
0 4 c
iii. «a c» 1-2
iv. «b d e»
2 b
a 1 5
b 2, 3 7 iv
c 4, 6 5 d e
d 5 7
e 7
корневой терминальный остальные
31
32. Индекс
Делаем таблицу
Лемма → Слова 3 ii 6 i
6 b c
1
i. «a b c»
3-4 a
ii. «a b»
iii
0 4 c
iii. «a c» 1-2
iv. «b d e»
2 b
a 1 α a, b 5
b 2, 3 β e 7 iv
c 4, 6 γ c, d 5 d e
d 5 δ b 7
e 7 ε a, c
«людям» (люди, человек) люди → (люди,человек)
человек → (человек), (люди,человек)
32 «человеку» (человек)
35. Что делать с документом
● Подготовить документ
● Найти терминальные узлы в индексе
● Проверить расстояния между словами фраз
● Посчитать релевантность
35
37. Что делать с документом
● Подготовить документ
● Найти терминальные узлы в индексе
● Проверить расстояния между словами фраз
● Посчитать релевантность
37
39. На входе ⇐
Коллекция фраз. Фраза это:
– Множество слов
Документ это:
– Большое множество слов
● Позиция слова
● Вес слова
39
40. Готовим вообще
«людям» (люди, человек)
«человеку» (человек)
Надо чтобы «людям» из документа = «человеку» в
индексе. Поэтому не подходит поиск в индексе по
словам из документа. Надо искать через леммы.
Преобразуем документ в таблицу:
Лемма → Список словопозиций с весами
Оригинал документа больше не нужен.
40
41. Готовим для индекса
лемма слова
В узлах индекса слова, а не леммы. α a, b
β e
γ c, d
δ b
Преобразуем документ в другую таблицу: ε a, c
Слово в индексе → Словопозиции и веса
Мы перевели документ в пространство слов индекса.
Теперь всё найдём!
Первая таблица Лемма → Список словопозиций с весами может
понадобиться для другого индекса.
41
43. Поиск
Это – разреженный
3 ii 6 i
интервал поиска™
6 b c
0 1 2 3 4 5 6 7 1
3-4 a
iii
0 4 c
1-2
Это документ
2 b
a 1:5 2:7 9:4 5
b 3:9 8:4
7 iv
c 5:6 5 d e
e 4:3 7:1 7
слова, позиции и веса
43
44. Поиск
Берём таблицу слова →
узлы индекса 3 ii 6 i
6 b c
a 1
b 2, 3 1
c 4, 6 3-4 a
d 5
iii
e 7 0 4 c
1-2
Делаем из документа 2 b
список узлов индекса 5
7 iv
a 1:5 2:7 9:4 5 d e
b 3:9 8:4 7
c 5:6
e 4:3 7:1
1 2 3 4 6 7
44
45. Поиск
1. Начинаем в корне, с пустым
интервалом поиска. 3 ii 6 i
6 b c
2. В каждом узле:
1
Обрезаем интервал от начала и до
3-4 a
●
номера текущего узла
включительно.
iii
0 4 c
● Если есть диапазон номеров
дочерних узлов, добавляем его в
1-2
интервал.
2 b
● Если узел терминальный, 5
добавляем его фразы в список
найденных. 7 iv
5 d e
3. Находим нижнюю границу 7
пересечения интервала с
документом. Это следующий
узел. 1 2 3 4 6 7
45
46. Пример
Пришли в узел 0
3 ii 6 i
Добавляем в пустой интервал 6 b c
диапазон 1-2
1
3-4 a
iii
0 4 c
1-2
0 1 2 3 4 5 6 7
2 b
5
7 iv
5 d e
7
1 2 3 4 6 7
46
47. Пример
Пришли в узел 1
3 ii 6 i
Удаляем из интервала 1 6 b c
Добавляем диапазон 3-4 1
3-4 a
iii
0 4 c
1-2
0 1 2 3 4 5 6 7
2 b
5
7 iv
5 d e
7
1 2 3 4 6 7
47
48. Пример
Пришли в узел 2
3 ii 6 i
Удаляем из интервала 2 6 b c
Добавляем 5 1
3-4 a
iii
0 4 c
1-2
0 1 2 3 4 5 6 7
2 b
5
7 iv
5 d e
7
1 2 3 4 6 7
48
49. Пример
Пришли в узел 3
3 ii 6 i
Удаляем из интервала 3 6 b c
Добавляем 6 1
Нашли фразу «a b»! 3-4 a
iii
0 4 c
1-2
0 1 2 3 4 5 6 7
2 b
5
i. «a b c» 7 iv
5 d e
ii. «a b» 7
iii. «a c»
iv. «b d e» 1 2 3 4 6 7
49
50. Пример
Пришли в узел 4
3 ii 6 i
Удаляем из интервала 4 6 b c
Добавлять нечего 1
Нашли фразу «a c»! 3-4 a
iii
0 4 c
1-2
0 1 2 3 4 5 6 7
2 b
5
i. «a b c» 7 iv
5 d e
ii. «a b» 7
iii. «a c»
iv. «b d e» 1 2 3 4 6 7
50
51. Пример
Пришли в узел 6
3 ii 6 i
Удаляем из интервала 5-6 6 b c
Добавлять снова нечего 1
Нашли фразу «a b c»! 3-4 a
Всё! iii
0 4 c
1-2
0 1 2 3 4 5 6 7
2 b
5
i. «a b c» 7 iv
5 d e
ii. «a b» 7
iii. «a c»
iv. «b d e» a b c e 1 2 3 4 6 7
51
52. Заметки к поиску
● Двигаемся по двум упорядоченным спискам чисел –
высокая скорость поиска.
0 1 2 3 4 5 6 7 1 2 3 4 6 7
● В узлах можно проверять соответствие
дополнительных условий фраз, «проходящих» через
узел, и условий документа – можно не заходить в
лишние ветки.
● Для более сложных индексов и документов интервал
поиска действительно становится разреженным, т. е.
зелёные и серые участки вперемешку.
52
53. Наш план
● О чём речь
● Кому это интересно
● Много букв (картинки будут)
● Ваши вопросы
● Мои ответы
53
54. Осталось чуть-чуть
● Проверить расстояния между словами
найденных фраз
● Посчитать релевантность
54
55. Пример на буквах
Это две фразы:
● ach
● dfpu
Это документ: a b c d e f g h i j k l m n o p q r s t u v w x y z
Нашли.
Но фраза d f p u слишком размазана по документу.
55
56. Проверка расстояний
Мы знаем слова найденных фраз и их позиции в
документе.
i. «a b c»
a 1:5 2:7 9:4
ii. «a b» b 3:9 8:4
c 5:6
iii. «a c» e 4:3 7:1
iv. «b d e»
слова, позиции и веса
Делаем список словопозиций.
Привязываем позиции к фразам.
Проверяем за один проход.
56
57. Релевантность
У слов найденных фраз есть веса в документе.
i. «a b c»
a 1:5 2:7 9:4
ii. «a b» b 3:9 8:4
c 5:6
iii. «a c» e 4:3 7:1
iv. «b d e»
слова, позиции и веса
Вычислить релевантность фраз можно, например, по TF-
IDF. Или другим методом.
57