Как сравнить миллионы описаний фильмов — из десятков источников и на разных языках? Как структурировать полученные данные и для каждого фильма агрегировать их в максимально полную информационную карточку?
Речь пойдёт о разных подходах к решению этой задачи (детерминированном, вероятностном, или методом машинного обучения), о необходимых библиотеках и инструментах, а также о сходных задачах.
9. Цель: красивая карточка для каждого фильма
〉 Терминатор
〉 История противостояния
солдата Кайла Риза и киборга-
терминатора…
〉 1984
〉 Великобритания, США
〉 … десятки других полей
9
10. А также
〉 Билеты в кино
〉 Посмотреть на ТВ
〉 Ссылки на просмотр онлайн
10
12. Связываем фильмы
Создаем отдельную коллекцию с эталонными
записями
〉 Как создавать и заполнять эталоны?
〉 Как находить эталоны для дубликата
〉 У двух фильмов разные описания - какое выбрать?
12
30. Сравниваем только топ N похожих карточек
〉 Какие поля использовать для сравнения
〉 Как выбрать N
30
31. Поля для сравнения
〉 название (на всех языках)
〉 название + год + страна
〉 все поля сразу
31
32. Сколько лучших совпадений просматривать?
Чтобы среди них в > 99% был искомый фильм
〉 1 - плохо
〉 2-4 может быть недостаточно для качества
〉 5-10 оптимально
〉 больше 20 - попробуйте построить другой индекс
32
33. Тестируйте качество
〉 Возьмите эталонную карточку фильма
〉 Проверьте что по ее полям находится она сама
〉 Удалите несоколько полей
〉 Проверьте что карточка все еще находится
〉 Повторите много раз с другими эталонами
33
37. Связываем дубликаты
〉 3 000 000 фильмов с повторами от разных
источников
〉 700 000 эталонных карточек фильмов
〉 Для каждого фильма находим до 20 похожих
карточек
Найденная карточка соответствует фильму или нет?
37
41. Детерминированный подход
Правила
〉 Должны совпадать название, год, и есть
совпадающие страны
〉 Если года отличаются не больше чем на один,
считаем что отличия нет (new!)
41
42. Детерминированный подход. Пример 2
Документ
〉 The Intouchables (EN)
〉 Неприкасаемые (RU)
〉 2011
〉 Франция
Эталон
〉 The Intouchables (EN)
〉 1+1 (RU)
〉 2011
〉 Франция
42
43. Детерминированный подход
Правила
〉 Должны совпадать название, год, и есть
совпадающие страны
〉 Если года отличаются не больше чем на один,
считаем что отличия нет
〉 Должно совпадать хотя бы одно название на одном
языке (new!)
43
44. Детерминированный подход. Пример 3
Документ
〉 Wanted (EN)
〉 Разыскивается (RU)
〉 2007
〉 США
Эталон
〉 Wanted (EN)
〉 Особо опасен (RU)
〉 2008
〉 США, Германия
44
45. Детерминированный подход
Правила
〉 Должны совпадать название, год, и есть
совпадающие страны
〉 Если года отличаются не больше чем на один,
считаем что отличия нет
〉 Должно совпадать хотя бы одно название на одном
языке
〉 Второе и третье правила только по одному (new!)
45
Поставщик 1 присылает только фильмы из России (new!)
Для сериалов должны пересекаться года +-3 (new!)
Если есть только одно название то оно должно совпадать хотя бы частично
(new!)
Если есть ссылка на кинопоиск
то ничего больше не надо проверять (ne
Не клеить больше чем один фильм (new!)
от одного источника к эталону (new!)
Если есть ссылка хотя бы на один
источник который уже склеен, используем эту ссылку (new!)
Для английского текста используем метрику Жаро-Винклера (new!)
46. Детерминированный подход
Плюсы
〉 Очень легко начать
〉 Можно понять что произошло
Минусы
〉 Постоянно появляются не учтенные кейсы
〉 Новые правила вносят новые ошибки и
противоречия
46
59. Вероятностный подход
Плюсы
〉 Хорошее отношение качество / сложность
реализации
〉 Легко дополнять и менять
Минусы
〉 Веса задаются субъективно
〉 Сложно сравнивать категориальные данные
59
60. Вероятностный подход
Когда применять
〉 Поля независимы
〉 Нет уникальных id
〉 Надо чтобы работало, без лишних затрат
〉 Детерминированный подход привел к хаосу
60
63. Подход машинного обучения
Создать обучающую выборку
〉 Фильм поставщика
〉 Эталон
〉 Правильная ли связь (да/нет)
Размер коллекции зависит от задачи
63
64. Подход машинного обучения
Строим классификатор
〉 Выбираем алгоритм
〉 Считаем признаки сравнения фильмов
〉 Обучаем алгоритм на выборке
〉 Тестируем качество работы
〉 Итеративно улучшаем алгоритм
64
65. Подход машинного обучения. Пример
Строим простые классификаторы
〉 Признаки - сравнения названий RU, EN, годов, стран
〉 Сравнения считаем так же как в вероятностном подходе
〉 Если [сходство поля] > [граница], принимаем связь
〉 Если [сходство поля] < [граница], отклоняем связь
Применяем AdaBoost
https://ru.wikipedia.org/wiki/AdaBoost 65
66. Подход машинного обучения. AdaBoost
Начальный вес 0
1. Год < 0.4 - 0.5
2. Страны > 0.2 + 0.35
3. Год < 0.8 - 0.25
4. Название (RU) < 0.8 - 0.25
5. Название (EN) > 0.6 + 0.2
Суммарный вес > 0 принимаем, <= 0 отклоняем связь
https://ru.wikipedia.org/wiki/AdaBoost 66
67. Подход машинного обучения
Плюсы
〉 Высокое качество, которое легко измеряется
〉 Максимальная автоматизация
Минусы
〉 Нужно создавать выборку для обучения
〉 Реализация и обучение алгоритма может занять много времени
〉 Результаты могут быть не интерпретируемы
67
68. Подход машинного обучения
Когда применять
〉 Качество матчинга записей - главная цель компании
〉 Есть умение выбирать нужный алгоритм машинного
обучения под задачу
〉 Или есть время разбираться
68
71. Не пишите
Библиотека Duke для поиска дубликатов и связи записей
〉 Вероятностный подход
〉 На базе Lucene
〉 Есть API и консольный интерфейс
〉 Конфигурирование через xml
〉 Apache license - подходит для коммерческой разработки
〉 https://github.com/larsga/Duke
71
73. Duke. Cleaner
73
/**
* A function which turn a value into a normalized value suitable
* for comparison.
*/
public interface Cleaner {
/**
* Returns a cleaned value.
*/
public String clean(String value);
}
74. Duke. Comparator
Простые для строк
〉 ExactComparator
〉 Levenshtein
〉 JaroWinkler
Сложные для разных типов
〉 PersonNameComparator
〉 SoundexComparator
74
75. Duke. Comparator
75
/** An operator which compares two values for similarity and returns
* a number in the range 0.0 to 1.0
*/
public interface Comparator {
/** Returns true if the comparator breaks string values up into
* tokens when comparing. Necessary because this impacts indexing
* of values.
*/
public boolean isTokenized();
public double compare(String v1, String v2);
}
76. Duke. DataSource
〉 CSV data source
〉 JDBC data source
〉 JSON data source
〉 …
〉 Custom data sources
76
77. Duke. DataSource
77
public interface DataSource {
/**
* Lazily load all records in memory to iterate through
*/
public RecordIterator getRecords();
/**
* Write this DataSource’s config to specified ConfigWriter
*/
void writeConfig(ConfigWriter cw);
}
78. Машинное обучение на java
Для коммерческой разработки без кластера
〉 Encog
〉 Cognitive Foundry
〉 Mallet
Для коммерческой разработки на кластере
〉 Apache mahout
〉 Apache Spark MLlib
78
79. Машинное обучение на java
Для исслелований
〉 Weka
〉 RapidMiner
〉 JSAT
〉 java-ml
79
80. Машинное обучение на java
Еще обзоры
〉 http://machinelearningmastery.com/java-machine-
learning/
〉 http://mloss.org/software/language/java/
80