Эталонное описание фильма на основе десятков дубликатов
- 9. Цель: красивая карточка для каждого фильма
〉 Терминатор
〉 История противостояния
солдата Кайла Риза и киборга-
терминатора…
〉 1984
〉 Великобритания, США
〉 … десятки других полей
9
- 12. Связываем фильмы
Создаем отдельную коллекцию с эталонными
записями
〉 Как создавать и заполнять эталоны?
〉 Как находить эталоны для дубликата
〉 У двух фильмов разные описания - какое выбрать?
12
- 18. Создаем эталоны
Документ (источник 2)
〉 Терминатор
〉 История противостояния
солдата Кайла Риза и
киборга…
〉 1984
〉 Великобритания, США
Эталон
〉 Терминатор
〉 1984
〉 США
18
- 19. Создаем эталоны
Документ (источник 2)
〉 Терминатор
〉 История противостояния
солдата Кайла Риза и
киборга…
〉 1984
〉 Великобритания, США
Эталон
〉 Терминатор
〉 История противостояния
солдата Кайла Риза и
киборга…
〉 1984
19
- 32. Сколько лучших совпадений просматривать?
Чтобы среди них в > 99% был искомый фильм
〉 1 - плохо
〉 2-4 может быть недостаточно для качества
〉 5-10 оптимально
〉 больше 20 - попробуйте построить другой индекс
32
- 33. Тестируйте качество
〉 Возьмите эталонную карточку фильма
〉 Проверьте что по ее полям находится она сама
〉 Удалите несоколько полей
〉 Проверьте что карточка все еще находится
〉 Повторите много раз с другими эталонами
33
- 37. Связываем дубликаты
〉 3 000 000 фильмов с повторами от разных
источников
〉 700 000 эталонных карточек фильмов
〉 Для каждого фильма находим до 20 похожих
карточек
Найденная карточка соответствует фильму или нет?
37
- 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!)
- 51. Сравниваем поля
Названия [ 0.3 - 0.7 ]
〉 Терминатор - Терминатор 1 [0.7]
〉 Ниндзя Терминатор - Терминатор 0.625 [0.55]
〉 Терминатор - Золушка 0 [0.3]
Метрика Жаро-Винклера подойдет для текста. Для нетекстовых
полей придумать свои сравнения
51
- 54. Агрегируем вероятности (Наивный Байес)
〉 Предполагаем независимость
〉 Начальная вероятность 0.5
0.7 · 0.4 · 0.6
0.7 · 0.4 · 0.6 + 0.3 · 0.6 · 0.4
54
= 0.7
- 56. Вероятностный подход. Пример 2
Документ
〉 The Intouchables (EN)
〉 Неприкасаемые (RU)
〉 2011
〉 Франция
Эталон
〉 The Intouchables (EN)
〉 1+1 (RU)
〉 2011
〉 Франция
56
Вес
0.7
0.3
0.6
0.6
0.7
- 57. Вероятностный подход. Пример 3
Документ
〉 Wanted (EN)
〉 Разыскивается (RU)
〉 2007
〉 США
Эталон
〉 Wanted (EN)
〉 Особо опасен (RU)
〉 2008
〉 США, Германия
57
Вес
0.7
0.3
0.4
0.5
0.4
- 59. Вероятностный подход
Плюсы
〉 Хорошее отношение качество / сложность
реализации
〉 Легко дополнять и менять
Минусы
〉 Веса задаются субъективно
〉 Сложно сравнивать категориальные данные
59
- 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);
}
- 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
- 80. Машинное обучение на java
Еще обзоры
〉 http://machinelearningmastery.com/java-machine-
learning/
〉 http://mloss.org/software/language/java/
80