В этом блоге я проведу вас через процесс изучения встраивания слов в данных обзоров Airbnb. Статья структурирована следующим образом:

  1. Интуиция встраивания слов
  2. Модели встраивания слов
  3. Обзор данных
  4. Модель обучения
  5. Результат

1. Интуиция вложения слов

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

В методе one-hot vector каждое слово в предложении или словаре представлено вектором. Например, если в нашем словаре 10 000 слов, то каждое слово представлено вектором из 10 000 измерений. Для упрощения рассмотрим пример:

«Я хочу съесть банан»

В предложении выше 6 слов [а, банан, есть, я, хочу, хочу]. Допустим, у нас есть словарь, в котором мы представляем каждое слово горячим вектором. Предположим, наши 6 слов находятся на следующих позициях в нашем словарном запасе:

[0], банан [2120], съесть [3500], я [4080], до [8650], хочу [9990]

Каждое слово представлено как вектор размерности 10000, как показано в Таблице 1:

Это неэффективный способ представления слов, потому что:

  1. Размер вектора зависит от размера словаря. По мере расширения словаря размер увеличивается, что затрудняет вычисления.
  2. Этот метод не фиксирует отношения между словами. Например, «яблоко» и «апельсин» - это фрукты, но они далеки друг от друга в одном горячем векторном представлении.

Чтобы преодолеть эти недостатки и изучить более качественные представления слов, были введены более эффективные модели встраивания слов.

2. Модели встраивания слов

Самые популярные модели встраивания слов:

  1. Word2Vec
  2. FastText
  3. "Перчатка"

Основные идеи, лежащие в основе моделей встраивания слов:

  1. Каждое слово в словаре представлено как многомерный вектор непрерывных чисел с плавающей запятой.
  2. Семантически похожие слова отображаются в ближайшие точки геометрического пространства.
  3. Векторы слов могут иметь размеры n, и n может принимать любое число в качестве ввода от пользователя, создавшего его.

Например, такие слова, как «яблоко» и «апельсин», отображаются ближе друг к другу в векторном пространстве.

Затем давайте посмотрим, как мы можем изучить вложения слов в наборе данных обзора Airbnb с помощью библиотеки gensim.

3. Обзор данных

Набор данных загружается с веб-сайта открытых данных Airbnb: http://insideairbnb.com/get-the-data.html

Используемый набор данных представляет собой обзорный набор данных из списков Airbnb в Нью-Йорке. Файл имеет формат * .csv. Я импортировал набор данных с помощью метода pandas read_csv. В данных 1143036 записей, т.е. отзывов. В таблице 2 показаны первые 5 строк данных.

Некоторые комментарии содержат пустые записи. Я удаляю эти комментарии. После удаления пустых записей в нашем наборе данных осталось 1 142 464 отзыва. Поскольку нас интересуют только комментарии к обзору, давайте рассмотрим только столбец «комментарии». Рассмотрим пример обзора в таблице 3.

Немногие обзоры написаны на других языках, кроме английского. Я проигнорирую это в данном анализе. Начнем с предварительной обработки данных. Шаги предварительной обработки:

  1. Сначала я разделю предложения на отдельные слова с помощью токенизатора из библиотеки nltk.
  2. Преобразуйте каждый токен в нижний регистр. Почему мы переводим токены в нижний регистр? Модель может трактовать слово, стоящее в начале предложения, с заглавной буквы, отличной от того же слова, которое появляется позже в предложении, но без последней заглавной буквы.
  3. Удалите знаки препинания.
  4. Удалите стоп-слова. Стоп-слова - это более распространенные слова, например: a, an, the. Они удаляются, потому что не помогают нам найти контекст или истинное значение предложения.
  5. Добавить предварительно обработанные токены в список.

После предварительной обработки данных обзора у нас есть список слов, который составляет наш корпус. Например:

Проверка перед предварительной обработкой:

The Midtown Castle was a great choice for our weekend stay. It is centrally located, and walking distance for most of our stops. The apartment was clean, nicely decorated, and the perfect size for our trip. Jennifer was a great host, and made our self check-in very easy! She gave us all of the information we needed for a smooth trip.  I would highly recommend this place to other visitors, and would consider staying there again when we are back in NYC!

Проверка после предварительной обработки:

['midtown', 'castle', 'great', 'choice', 'weekend', 'stay', 'centrally', 'located', 'walking', 'distance', 'stops', 'apartment', 'clean', 'nicely', 'decorated', 'perfect', 'size', 'trip', 'jennifer', 'great', 'host', 'made', 'self', 'checkin', 'easy', 'gave', 'us', 'information', 'needed', 'smooth', 'trip', 'would', 'highly', 'recommend', 'place', 'visitors', 'would', 'consider', 'staying', 'back', 'nyc']

В корпусе 1 142 464 списка отзывов. Затем мы обучим модель word2vec в нашем текстовом корпусе, чтобы узнать векторы слов для каждого из терминов в нашем корпусе.

4. Модель обучения

Я обучаю модель word2vec, импортированную с использованием библиотеки gensim в корпусе. Для обучения я даю размер встраивания (размер вектора слова) как 100 и размер окна 5.

from gensim.models import Word2Vec
model_w2v = Word2Vec(sentences=review_lines, size=EMBEDDING_SIZE, window=WINDOW_SIZE, sg=1, hs=0, min_count=3,workers = 4, seed=4)

Где, sg = 1, означает, что мы используем модель пропуска грамматики, что в основном означает, что мы собираемся предсказывать контекстные слова с учетом целевого слова.

min_count = 3, указывает, что модель игнорирует все слова с общей частотой ниже 3.

hs = 0, будет использоваться отрицательная выборка

worker = 4, используйте это множество рабочих потоков для обучения модели (= более быстрое обучение на многоядерных машинах)

seed = 4, начальное число для генератора случайных чисел. Начальные векторы для каждого слова заполняются хешем конкатенации слова + str (seed).

На моем компьютере обучение занимает около 15 минут.

5. Результат

После успешного обучения у нас есть векторное представление 100 измерений для каждого слова в нашем корпусе. В словаре 94 416 уникальных слов. Давайте посмотрим на пример вектора слова для слова «просторный»:

[-0.08653334, -0.6106071 , -0.41853306,  0.03007984,  0.01005792,
        0.33923474,  0.5310961 , -0.3685299 , -0.03650644, -0.2798122 ,
       -0.3607964 ,  0.11349513,  0.10972715,  0.17226698, -0.4610637 ,
        0.11351141,  0.15219958, -0.4055845 , -0.03373929, -0.08265369,
       -0.06079018, -0.06560601, -0.10936774,  0.24907511,  0.0087022 ,
       -0.09687304, -0.25126177,  0.2638443 ,  0.3671965 ,  0.4852466 ,
       -0.14594021, -0.00806846, -0.08359358,  0.13623747, -0.74597895,
       -0.45576113,  0.09269127,  0.11170986,  0.04807548, -0.00952091,
        0.08763056,  0.00583201,  0.21537836,  0.1945478 ,  0.07388721,
        0.08248948,  0.17196006,  0.05941069, -0.47340366,  0.23086719,
       -0.17785998, -0.07067276, -0.03502363,  0.17770194,  0.009686  ,
       -0.08309583,  0.2729562 ,  0.5033552 ,  0.11067104,  0.2742271 ,
        0.13204831,  0.29559165, -0.05023228, -0.5231171 ,  0.24047068,
       -0.14184578, -0.32505193,  0.29703274,  0.34943336,  0.1698646 ,
       -0.07232655, -0.05792387, -0.9920956 ,  0.1671232 , -0.2966048 ,
       -0.23652361, -0.14054477, -0.0418704 , -0.1268654 , -0.29366162,
        0.5231739 ,  0.64307195, -0.11744374, -0.5739773 , -0.03040001,
       -0.14233364,  0.11860499,  0.23769848,  0.10131575, -0.12037887,
        0.04392412, -0.17023355,  0.06672142,  0.15518756, -0.46170688,
        0.38015658,  0.03878637, -0.09938765, -0.18151402, -0.09291829]

Основная идея встраивания слов состоит в том, что они отображают похожие слова ближе друг к другу в векторном пространстве. Давайте проверим, какие слова больше всего похожи на слово «шикарный» в наших вложениях.

model_w2v.wv.most_similar("posh", topn = 10)
[('upscale', 0.816124439239502),
 ('upmarket', 0.8132613301277161),
 ('ritzy', 0.8094249963760376),
 ('swanky', 0.7905825972557068),
 ('pretentious', 0.7737554907798767),
 ('glamorous', 0.7656188607215881),
 ('unpolished', 0.760246992111206),
 ('oldtime', 0.7590675950050354),
 ('regentrified', 0.7541607618331909),
 ('squarely', 0.7538461685180664)]

Как мы видим, такие слова, как высококлассный, престижный, имеют наибольшее сходство со словом «шикарный», что имеет полный смысл. Очень впечатляюще!! не так ли?

Давайте посмотрим на другой пример.

model_w2v.wv.most_similar("safe", topn = 10)
[('secure', 0.8628112077713013),
 ('safecomfortable', 0.7868499755859375),
 ('buildingneighborhood', 0.7799450159072876),
 ('safethe', 0.776686429977417),
 ('residential', 0.7686926126480103),
 ('supersafe', 0.7678200006484985),
 ('familyoriented', 0.7589210867881775),
 ('patrolled', 0.7526394128799438),
 ('safefeeling', 0.7492380142211914),
 ('queit', 0.7487712502479553)]

Отличная работа!!

Мы также можем видеть в заданном списке слов, какое слово является лишним. Например:

model_saved.wv.doesnt_match(['comfotable','cozy','dirty','clean','safe','nice'])
'dirty'

Верно!!

Это был мой краткий обзор встраивания слов. Надеюсь, вам понравилось это читать. Пожалуйста, оставьте свои комментарии и отзывы. Спасибо !!

Ссылки: