Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Data Mining #7 / Обработка естественного языка [Технострим]

Data Mining #7 / Обработка естественного языка [Технострим]

More Decks by Технострим Mail.ru Group

Transcript

  1. Содержание 1. Применение NLP в Почте 2. Предобработка: токенизация, лемматизация,

    стемминг 3. Признаковое описание текста: BOW, TF-IDF, CountVectorizer, HashingVectorizer 4. Дистрибутивная семантика: word2vec, fastText 5. Поиск околодубликатов: minhash, simhash, LSH 2
  2. Текст: уровни абстрации • буквы • char-ngrams • BPE tokens

    • слова • word ngrams • предложения • документы Все зависит от решаемой задачи 9
  3. Токенизация Токенизация - разбиение текста на структурные единицы (токены), нужные

    для конкретной задачи Слово - минимальный фрагмент текста, имеющий смысловую значимость Часто токенизация = разбиение текста на слова 11
  4. Разбиение на слова: специфика языка Разбить на слова - кажется,

    просто Но не всегда… Зависит от языка текста 13 «Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz» « Закон о передаче обязанностей контроля маркировки говядины»
  5. Разбиение на слова: пунктуация • Finland’s capital → Finland? Finlands?

    Finland’s ? • what’re, I’m, isn’t • L’ensemble → L? L’? Le? • 9 a.m, i.e. • Hewlett-Packard, Немирович-Данченко • San Francisco, Лос Анджелес, Нью-Васюки • Различные эмоджи ;), :(, =D 14 Правильно алгоритм токенизации учить под конкретный корпус с учетом его специфики
  6. Разбиение на предложения 16 Это просто: сегментируем по знакам препинания

    «?!.» В связи с этим первый интервал пробегов был принят равным 350...700 тыс. км. (середина интервала - 525 тыс. км.), второй интервал - 700...1050 тыс. км. (середина интервала - 875 тыс. км.) и третий интервал 1050...1400 тыс. км. (середина интервала -- 1225 тыс. км.).
  7. Разбиение на предложения 17 Эвристики: • Предложение должно содержать буквы

    • Предложение должно начинаться с заглавной буквы • Сокращения требуют «особого внимания»: г., тыс., млн., ул., км., • Отдельные большие буквы тоже: А.Б. Иванов • … Но можно учить токенизатор на предложения с помощью ML с учетом специфики корпуса
  8. Стемминг 19 Превращение словоформы в псевдооснову (стем) путем отбрасывания псевдоокончания

    - бессловарный подход Стеммеры: - эвристические алгоритмы (Porter, Snowball) - статистические алгоритмы (Stemka) «больничных» —> «больничн»
  9. Стемминг 23 Вопрос: есть поисковая система. Что произойдет с точностью

    и полнотой поиска, если применить стемминг? - полнота возрастет (схлопнем разные словоформы в одну) - точность может пострадать (если приведем разные слова к одному стему: лев, левый -> лев)
  10. Лемматизация 24 Отображение словоформы в нормальную форму - лемму (сущ

    -> ед.ч., им. падеж; глагол -> инфинитив;…) 
 Лемматизация - словарный подход.
  11. Лемматизация 25 Отображение словоформы в нормальную форму - лемму (сущ

    -> ед.ч., им. падеж; глагол -> инфинитив;…) 
 Лемматизация - словарный подход. Есть возможность генерации и склонения несловарных слов. Популярные лемматизаторы - pymorphy - mystem - AOT «хрюкотали» —> «хрюкотать»
  12. Признаковое описание: one-hot-encoding Самый простой подход - бинарные признаки наличия

    слова в документе (one-hot-encoding) Предположим, что мы обрабатываем коллекцию документов Q: Как будет выглядеть представление документа? A: Вектор с размерностью, равной количеству уникальных слов в коллекции 27
  13. Признаковое описание: CountVectorizer 29 Чем чаще слово встречается в тексте,

    тем оно важнее Давайте хранить не бинарный признак, а счетчик (сколько раз слово встретилось в документе). Q: Как будет выглядеть представление документа в этом случае? A: Так же, как и ранее
  14. Признаковое описание: TfIdfVectorizer 30 Слишком частотные слова отражают специфику семантики

    корпуса, но не тему документа. Слишком редкие слова - можно рассматривать как шум. Наиболее информативные слова - встречающиеся довольно часто в относительно небольшом количестве документов.
  15. Признаковое описание: TfIdfVectorizer 31 TF - term frequency Длина документа

    в словах Q: зачем нормализуют на длину документа?
  16. Признаковое описание: TfIdfVectorizer 32 DF - document frequency DF =

    |{di ∈ D|t ∈ di }| |D| IDF = 1 DF - inversed DF Отражает, в скольки документах корпуса встречается данный токен.
  17. Признаковое описание: TfIdfVectorizer 33 TF-IDF TfIdf = TF * IDF

    = TF * log( |D| |{di ∈ D|t ∈ di } ) Q1: Чему равен TfIdf для слова, встретившегося во всех документах корпуса? сглаживание Q2: Учитывается ли порядок слов в предложении?
  18. Признаковое описание: Bag Of Words 34 Документ - мешок слов

    (BOW) 1) «Мне нравится, что вы больны не мной» 2) «Мне не нравится, что вы больны мной»
  19. Признаковое описание: Bag Of Words 35 Документ - мешок слов

    (BOW) 1) «Мне нравится, что вы больны не мной» 2) «Мне не нравится, что вы больны мной» Один и тот же вектор для обоих предложений Q: Как можно подкостылить, чтобы учитывать порядок слов?
  20. Признаковое описание: Bag Of Ngrams 36 Мешок слов (BOW) ->

    Мешок слов + n-грамм 1) «Мне нравится, что вы больны не мной» 2) «Мне не нравится, что вы больны мной»
  21. Признаковое описание: Bag Of Ngrams 37 Мешок слов (BOW) ->

    Мешок слов + n-грамм 1) «Мне нравится, что вы больны не мной» 2) «Мне не нравится, что вы больны мной» Q: Чем плох такой подход? A: Размерность вектора возрастает на порядки
  22. Признаковое описание: Bag Of Ngrams 39 Можно ограничиться только частотными

    n-граммами Однако это не решает проблему в полной мере. Признаков все равно может быть очень много
  23. Признаковое описание: Bag Of Ngrams 40 Можно ограничиться только частотными

    n-граммами Однако это не решает проблему в полной мере. Признаков все равно может быть очень много Пути решения: - отобрать максимально информативные признаки - перейти в новое признаковое пространство
  24. Отбор признаков 41 Q: Что можно использовать для отбора признаков?

    А: Например, l1-регуляризацию. Регулируя величину коэффициента, можно регулировать количество признаков, которые нужно оставить Есть также методы жадного добавления/удаления признаков, основанные на взаимной информации, статистике и т.п.
  25. Модификация признаков 42 Можно перейти в новое признаковое пространство. Например,

    приблизив матрицу признаков с помощью произведения матриц меньшего ранга (t-SVD, PCA и т.д.).
  26. Модификация признаков: Hashing Trick 43 Можно перейти в новое признаковое

    пространство за счет хеширования признаков исходного пространства • Выбираем количество новых признаков (К bucket’ов для хеш-функции) • Выбираем хеш-функцию, отображающую признак на число [0..K] • Хешируем каждый признак исходного пространства • … • Profit!
  27. Модификация признаков: Hashing Trick 44 Мы только что сократили размерность

    пространства признаков с N до K ! K ∼ 103 − 105 N ∼ 105 − 108 Hashing Trick или Feature Hashing sklearn: HashingVectorizer VowpalWabbit
  28. Векторное представление слов 46 Хотим получить векторное представление для слов,

    чтобы: - вектора были плотные - слова, схожие по смыслу, имели схожие векторы *Вектор = Embedding/Эмбединг Vector(«красивый») ≈ Vector(«прекрасный»)
  29. Term-Document Matrix 48 Минусы: - нужно много документов - важна

    “тематическая однородность” документов - размерность вектора сильно зависит от размера коллекции текстов
  30. Co-Occurence Matrix 49 Показывает, сколько раз слово оказалось в одном

    контексте (например, в окне определенного размера) с другим словом - у похожих слов вектора похожи (так как встречаются в одном контексте) - минусы те же, что и у подхода с Term-Document Matrix
  31. PMI Matrix 50 Обычно сглаживают: Q: чему равна PMI в

    случае, если слова встречаются независимо друг от друга? PMI - pointwise mutual information PMI(w, c) = p(w, c) p(w) ⋅ p(c) PMI(w, c) = log( p(w, c) p(w) ⋅ p(c) )
  32. PMI Matrix 51 Вероятности оцениваются через счетчики PMI(w, c) =

    log( p(w, c) p(w) ⋅ p(c) ) p(w) = N(w) Nall_words p(w, c) = N(w, c) Nall_words PMI(w, c) = log N(w, c) ⋅ Nall_words N(w) ⋅ N(c)
  33. PPMI Matrix 52 PPMI - Positive PMI PPMI(w, c) =

    max(0, PMI(w, c)) = max(0, log( p(w, c) p(w) ⋅ p(c) )) Для редких слов PMI < 0
  34. Term-Doc/PMI/PPMI Matrix Factorization 53 - truncated SVD - PCA -

    … - вычислительно сложно - непонятно, как работать с новыми документами Проблемы:
  35. Дистрибутивная семантика 55 Дистрибутивная гипотеза: cмысл слова - распределение над

    его контекстами Слова похожи по смыслу, если встречаются в похожих контекстах - Я люблю тяжелую и ритмичную Х. - Какую Х вы предпочитаете слушать во время бега ? - Группа «Bullet For My Valentine» играет Х в стиле extreme-metal. Никаких затруднений восстановить пропуск - контекст определяет слово
  36. Word2Vec 56 Можно предсказывать слово по его контексту и наоборот

    Предсказываем слово по контексту - Continious Bag Of Words (CBOW) Предсказываем контекст по центральному слову - Skip-Gram
  37. Word2Vec: word vectors 60 Как оценить ? P(wc |wt )

    - каждому слову соответствует векторное представление - каждое слово выступает в двух ипостасях: как центральное и контекстное - будем использовать для каждого слова два вектора: vw uw - когда слово w - центральное - когда слово w - контекстное uT c ⋅ vt - чем больше, тем выше вероятность встретить в контексте wt wc
  38. Word2Vec: word vectors 61 Как оценить ? P(wc |wt )

    - каждому слову соответствует векторное представление - каждое слово выступает в двух ипостасях: как центральное и контекстное - будем использовать для каждого слова два вектора: vw uw - когда слово w - центральное - когда слово w - контекстное uT c ⋅ vt - чем больше, тем выше вероятность встретить в контексте wt wc Нормализуют с помощью Softmax P(wc |wt ) = exp(uT c ⋅ vt ) ∑ w∈V exp(uT w ⋅ vt )
  39. 63 Forward pass: u h = VT x = VT

    (k,:) := vT wi u = UTh = UTVT x target y Word2Vec: Toy Example
  40. 64 Forward pass: p u h = VT x =

    VT (k,:) := vT wi u = UTh = UTVT x p = Softmax(u) target y Word2Vec: Toy Example
  41. 65 Forward pass: p u h = VT x =

    VT (k,:) := vT wi u = UTh = UTVT x p = Softmax(u) loss = cross_entropy(y, p) target y Word2Vec: Toy Example
  42. 66 Forward pass: p u h = VT x =

    VT (k,:) := vT wi u = UTh = UTVT x p = Softmax(u) loss = cross_entropy(y, p) target y Backward pass: Последовательно вычисляем градиенты по параметрам и изменяем их Word2Vec: Toy Example
  43. Word2Vec: SGNS 67 P(wc |wt ) = exp(uT c ⋅

    vt ) ∑ w∈V exp(uT w ⋅ vt ) суммирование по всему словарю Считать честный софтмакс дорого - Или применяют SkipGram Negative Sampling (SGNS): учим модель отличать слова из контекста от рандомно взятых из словаря. Можно использовать различные аппроксимации софтмакса, например, Hierarchical Softmax
  44. Word2Vec: качество векторов 68 Intrinsic evaluation («внутренняя» оценка): 
 -

    «в вакууме» на вспомогательной подзадаче - не коррелирует с продуктовыми метриками - быстро Extrinsic evaluation («внешняя» оценка): 
 - на реальной задаче - долго - если работает плохо, то непонятно, что именно
  45. Word2Vec: внешняя оценка 71 Оценка на конкретной задаче: • Machine

    Translation • NER • Question Answering • Information Retrieval • etc
  46. Word2Vec use cases: Music Recommendation 72 http://shorturl.at/abejp • Стриминговый сервис

    • Плейлисты + радио • Рекомендует песни на основе пользовательского контекста (какую включить следующей)
  47. Word2Vec use cases: Similar Listings 73 http://shorturl.at/dgpBY • учились на

    сессиях просмотров пользователей, завершившихся бронированием • негативные примеры из того же географического района • эмбеддинги для новых объектов - усреднение 3х ближайших на карте (с тем же типом недвижимости и диапазоном цен) • +21% CTR в карусели «Похожие»; +4.9% к сессиям, завершившихся бронированиями
  48. Word2Vec use cases: Product Recommendation 74 • для персонализации рекламы

    в почте • user2product и product2product модели • +9% CTR относительно других форматов; сравнимые конверсии в покупки https://arxiv.org/pdf/1606.07154.pdf
  49. FastText: Word2Vec on steroids 75 • Представляем слово в виде

    мешка символьных n-грамм разного порядка • Учим эмбеддинги для каждой n-граммы вместе со словами • Суммируем эмбеддинги для всех n-грамм слова и выученного вектора слова и получаем результирующий эмбеддинг слова
  50. FastText: Word2Vec on steroids 76 • Берут n-граммы в диапазоне

    3-6 • Можно взять еще и словесные n-граммы Что делать с большим количеством признаков?
  51. FastText: особенности реализации 77 • Хеширует символьные нграммы • И

    словесные нграммы тоже хеширует (причем, в те же бакеты) • Слова не хешируются • soft-sliding window - рандомно сэмплируется размер окна из равномерного распределения • Учится с SGNS аналогично Word2Vec • Можно учить вектора supervised • Можно получить сжатую версию модели (весит меньше на порядок с минимальной деградацией качества)
  52. FastText: плюсы 78 • работает со словами вне словаря •

    качественные вектора для редких слов • multi-core • really fast!
  53. Зачем нужно 80 • определение «зеркал» сайтов • аггрегация похожих

    новостей • схлопывание дубликатов (например, вакансий) • антиплагиат
  54. Похожесть строк 81 • Расстояние Левенштейна и аналоги • коэффициент

    Жаккара по словам/нграммам Как сравнить 2 строки?
  55. Расстояние Левенштейна 82 Минимальное количество операций вставки, удаления и замены

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

    на другой, необходимых для превращения одной строки в другую (веса операций могут отличаться). Q: За какое количество операций вы превратите воду в вино? Расстояние Левенштейна
  57. 84 Минимальное количество операций вставки, удаления и замены одного символа

    на другой, необходимых для превращения одной строки в другую (веса операций могут отличаться). Q: За какое количество операций вы превратите воду в вино? Добавляется операция транспозиции (перестановки) соседних символов Расстояние Дамерау-Левенштейна Расстояние Левенштейна
  58. Коэффициент Жаккара 86 - токенизируем - считаем коэффициент Жаккара -

    определяем дубликаты по порогу - … - Profit! - надо сравнить все пары между собой - число пар растет квадратично с увеличением размера корпуса Недостатки Было бы хорошо отделить потенциальных дубликатов и проверить их более тщательно
  59. Shingling 87 Разбиение документа на пересекающиеся последовательности буквенных n-gramm *shingle

    - черепица {«однаж», «днажд», «нажды», «ажды », «жды в», «ды в », «ы в с», …} "однажды в студеную зимнюю пору …» k=5
  60. Shingling 88 Разбиение документа на пересекающиеся последовательности буквенных n-gramm *shingle

    - черепица {«однаж», «днажд», «нажды», «ажды », «жды в», «ды в », «ы в с», …} "однажды в студеную зимнюю пору …» k=5 Шинглов порядка 5-10 очень много. Q: Что делать?
  61. Shingling 89 Разбиение документа на пересекающиеся последовательности буквенных n-gramm *shingle

    - черепица {«однаж», «днажд», «нажды», «ажды », «жды в», «ды в », «ы в с», …} "однажды в студеную зимнюю пору …» k=5 Шинглов порядка 5-10 очень много. Q: Что делать? A: Хешировать
  62. Shingling 90 Можем представлять документ не множеством шинглов, а множеством

    хешей от шинглов. • Уменьшим количество шинглов • Нет необходимости хранить словарь • Можем вычислять «на лету» • Можем корректно работать с новыми последовательностями
  63. MinHash 91 1)Who was the first king of Poland 2)Who

    was the first ruler of Poland 3)Who was the last pharaoh of Egypt http://infolab.stanford.edu/~ullman/mmds/book.pdf J12 = 0.75 J13 = 0.4 J23 = 0.4
  64. MinHash 95 Повторим процедуру еще 5 раз: - рандомно переиндексируем

    словарь - выберем минимальный id слова в качестве характеристики документа
  65. MinHash Повторим такую операцию еще 4 раза и выпишем для

    документов получившиеся последовательности (сигнатуры) Signature(“Who was the first king of Poland”) = [2, 1, 1, 3, 1, 1] Signature(“Who was the first ruler of Poland”) = [2, 1, 1, 1, 1, 1] Signature(“Who was the last pharaoh of Egypt”) = [1, 1, 3, 4, 4, 1]
  66. MinHash 98 Повторим такую операцию еще 4 раза и выпишем

    для документов получившиеся последовательности (сигнатуры) Signature(“Who was the first king of Poland”) = [2, 1, 1, 3, 1, 1] Signature(“Who was the first ruler of Poland”) = [2, 1, 1, 1, 1, 1] Signature(“Who was the last pharaoh of Egypt”) = [1, 1, 3, 4, 4, 1] Можем посчитать коэффициент Жаккара между сигнатурами:
  67. MinHash 99 Коэффициент Жаккара между сигнатурами - оценка «честного» коэффициента

    Жаккара между шинглированными документами Чем больше операций переиндексации словаря мы делаем - тем точнее оценка
  68. MinHash 100 Коэффициент Жаккара между сигнатурами - оценка «честного» коэффициента

    Жаккара между шинглированными документами Чем больше операций переиндексации словаря мы делаем - тем точнее оценка Перемешивание словаря не очень эффективно: - надо хранить словарь - надо хранить перестановки Идейно - слову надо сопоставить рандомную чиселку
  69. MinHash 101 Давайте вместо перемешивания словаря каждый раз: - выбирать

    хеш-функцию (каждый раз разную) - применять ее ко всем шинглам документов - характеризовать документ минимальным хешем (MinHash) из получившихся
  70. MinHash 102 Давайте вместо перемешивания словаря каждый раз: - выбирать

    хеш-функцию (каждый раз разную) - применять ее ко всем шинглам документов - характеризовать документ минимальным хешем (MinHash) из получившихся Работает так же концептуально, но лучше: • не надо хранить словарь • можно работать с элементами вне словаря • запоминаем только набор хеш-функций
  71. MinHash 103 Итак: - научились строить минхэш-сигнатуры для каждого из

    документов - выяснили, что коэффициент Жаккара для минхэш- сигнатур - аппроксимация честного коэффициента Жаккара по шинглам Но пар документов все так же много…
  72. LSH - locality sensitive hashing 104 Doc1 = [2, 1,

    1, 2, 1, 1] = [211, 311] Doc2 = [2, 1, 1, 1, 1, 1] = [211, 111] Doc3 = [1, 1, 3, 4, 4, 1] = [113, 441] Давайте разобьем полученные сигнатуры на группы по 3 элемента
  73. LSH 105 Doc1 = [2, 1, 1, 2, 1, 1]

    = [211, 311] Doc2 = [2, 1, 1, 1, 1, 1] = [211, 111] Doc3 = [1, 1, 3, 4, 4, 1] = [113, 441] Давайте разобьем полученные сигнатуры на группы по 3 элемента Заметим, что околодубликаты имеют общую группу Оценим вероятность того, что для похожих документов (Doc1 и Doc2) будет хотя бы одна общая группа
  74. LSH 106 1) Вероятность совпадения любой пары минхэшей равна коэффициенту

    Жаккара между документами: P1 = J12 = 0.75 2) Вероятность совпадения всех минхэшей в группе из 3х элементов: P2 = P3 1 = J3 12 = 0.753 ≈ 0.42 3) Вероятность несовпадения хотя бы 1 пары минхэшей в группе из 3х элементов: P3 = 1 − P2 = 1 − J3 12 ≈ 0.58
  75. LSH 107 4) Вероятность несовпадения в обоих группах хотя бы

    1 пары минхэшей: 5) Вероятность того, что минхэши хотя бы в одной группе по 3 элемента совпадут: P4 = P2 3 = (1 − J3 12 )2 ≈ 0.582 = 0.34 P5 = 1 − P4 = 1 − (1 − J3 12 )2 ≈ 0.66 P12 = (1 − J3 12 )2 ≈ 0.66 P13 = P23 = (1 − J3 13 )2 ≈ 0.12
  76. LSH 108 В общем случае разбили сигнатуру на b групп

    по n элементов в каждой. Вероятность того, что документы имеют хотя бы одну общую группу из n элементов: Psim = 1 − (1 − Jn)b Чем больше размер группы - тем точнее склеиваем дубликаты, но теряем в покрытии b ↑ ⇒ fp ↓ ; fn ↑ b ↓ ⇒ fp ↑ ; fn ↓
  77. LSH 109 Обычно задаются пороговым значением коэффициента Жаккара t, выше

    которого считают документы дубликатами. Затем подбирают количество групп разбиения n и размер группы b, исходя из следующего правила. b ⋅ n = const t ≈ 1 b 1 n
  78. LSH 110 Группы минхэшей называются супершинглами. Можно использовать супершинглы (а

    лучше - хеши от них) в качестве ключей для хэш-таблицы. В качестве значений, например, id документа Doc1 = [211, 311] Doc2 = [211, 111] Doc3 = [113, 441]
  79. LSH 111 Группы минхэшей называются супершинглами. Можно использовать супершинглы (а

    лучше - хеши от них) в качестве ключей для хэш-таблицы. В качестве значений, например, id документа Doc1 = [211, 311] Doc2 = [211, 111] Doc3 = [113, 441] 211 111 113 311 441 Doc2 Doc3 [Doc1, Doc2 ] Doc1 Doc3 Потенциальные дубликаты попадают в один бакет
  80. LSH: recap 112 Как искать околодубликаты online: - обрабатываем корпус

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