Как добиться нужного сходства?

Встраивание слов — это тип представления слов, который позволяет словам со схожим значением иметь аналогичное представление.

Существует множество способов найти похожие слова/документы с помощью библиотеки обработки естественного языка Gensim с открытым исходным кодом. В этой статье я представлю обзор современных вложений слов, таких как Word2vec от Google, FastText от Facebook, и рассмотрю, какие бизнес-задачи подходят для них лучше всего.

Оглавление

  1. Введение в сходство слов
  2. Что такое Генсим?
  3. Введение в Word2Vec
  4. Вычислить сходство
  5. Вычислить сходство с FastText

1. Введение в сходство слов

Какое слово больше всего похоже на «король»? Это "Канут" или он "коронован"? Это зависит от того, что вы подразумеваете под похожим. «Король» можно заменить на «Канут», но его атрибут — «корона». Мы обсудим, как выполнить эти два вида подобия из встраивания слов. Также коснитесь того, как справляться с распространенными проблемами, связанными с редкими, частыми и выпадающими из словаря словами.

2. Что такое Генсим?

Gensim — это библиотека с открытым исходным кодом для неконтролируемого тематического моделирования и обработки естественного языка с использованием современного статистического машинного обучения.

Документ

В Gensim документ — это объект типа текстовой последовательности (обычно известный как str в Python 3). Документом может быть что угодно: от короткого твита из 140 символов до одного абзаца (т. е. реферата журнальной статьи), новостной статьи или книги.

Вы можете получить текст «Гордости и предубеждения» с помощью приведенной ниже команды в своем блокноте:

Мы собираемся обрабатывать текст с помощью spaCy. Это легко, и это можно сделать одной строкой кода. Если вы хотите узнать больше о spaCy, прочтите эту статью: Введение в обработку естественного языка с помощью spaCy и NLTK.

Корпус

Корпус представляет собой набор объектов документов или текстов. Корпуса выполняют две роли в Gensim:

  1. Вход для обучения модели.
  2. Документы для организации.
7045
124743

Имеющиеся у нас корпуса состоят из 124743 слов и 7045 предложений.

[This was invitation enough., 
“Why, my dear, you must know, Mrs. Long says that Netherfield is taken by a young man of large fortune from the north of England; that he came down on Monday in a chaise and four to see the place, and was so much delighted with it, that he agreed with Mr. Morris immediately; that he is to take possession before Michaelmas, and some of his servants are to be in the house by the end of next week.”, 
“What is his name?”, 
“Bingley.”]

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

3. Введение в Word2Vec

Используя большое количество неаннотированного простого текста, word2vec автоматически изучает связи между словами. На выходе получаются векторы, по одному вектору на слово, с замечательными линейными отношениями.

Word2Vec очень полезен для автоматической разметки текста, рекомендательных систем и машинного перевода.

Word2Vec – это более новая модель, в которой слова встраиваются в маломерное векторное пространство с использованием неглубокой нейронной сети. Результатом является набор векторов слов, где векторы, расположенные близко друг к другу в векторном пространстве, имеют сходные значения в зависимости от контекста, а векторы слов, удаленные друг от друга, имеют разные значения. Например, strong и powerful будут близко друг к другу, а strong и Paris будут относительно далеко.

Gensim Version: 3.8.3
['\ufeffThe',
 'Project',
 'Gutenberg',
 'eBook',
 'of',
 'Pride',
 'and',
 'Prejudice',
 ',',
 'by',
 'Jane',
 'Austen']

4. Вычислить сходство

Мы собираемся обучить модель, которая предсказывает, что изменчивые слова, такие как побережье и берег, будут похожими.

1158
Training Loss: 950331.125
('Wickham', 0.980459451675415)
('Bingley', 0.9763346314430237)
('Collins', 0.9562931656837463)
('Gardiner', 0.8955026268959045)
('Bennet', 0.8948332071304321)
('Forster', 0.8749879598617554)
('Phillips', 0.862018346786499)
('Long', 0.8612229824066162)
('Hurst', 0.8530021905899048)
('Eliza', 0.8384509086608887)

Обучение Word2Vec — это неконтролируемая задача, оптимального способа объективно оценить результат не существует.

5. Вычислить сходство с FastText

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

Этот модуль содержит быструю реализацию fastText на C с интерфейсами Python. Это не только оболочка для реализации Facebook.

Этот модуль поддерживает загрузку моделей, обученных с помощью реализации fastText от Facebook. Он также поддерживает непрерывное обучение на таких моделях.

('darcy', 0.9835901856422424)
('Bingley', 0.9773436784744263)
('Bingleys', 0.9726883769035339)
('Collins', 0.9680862426757812)
('Wickham', 0.9555540084838867)
('Collinses', 0.9483668804168701)
('Bennets', 0.9152289032936096)
('Bennet', 0.9142839908599854)
('Gardiners', 0.8979448676109314)
('Gardiner', 0.8917876482009888)
('darcy', 0.9835901856422424)
('Bingley', 0.9773436784744263)
('Bingleys', 0.9726883769035339)
('Collins', 0.9680862426757812)
('Wickham', 0.9555540084838867)
('Collinses', 0.9483668804168701)
('Bennets', 0.9152289032936096)
('Bennet', 0.9142839908599854)
('Gardiners', 0.8979448676109314)
('Gardiner', 0.8917876482009888)
('Hurst', 0.8849090337753296)
('Phillips', 0.8810683488845825)
('F.', 0.8773263096809387)
('Denny', 0.8647773265838623)
('Long', 0.8453436493873596)
('Reynolds', 0.8436615467071533)
('Jones', 0.841410756111145)
('Lucas', 0.8343479633331299)
('Forster', 0.8325433135032654)
('Fitzwilliam', 0.831404447555542)
('darcy', 0.9902123212814331)
('Bingley', 0.9461977481842041)
('Bingleys', 0.9363999366760254)
('Wickham', 0.9162226915359497)
('Collins', 0.8991371989250183)
('Bennet', 0.893693745136261)
('Collinses', 0.8936198949813843)
('Bennets', 0.8793412446975708)
('Gardiners', 0.8120923042297363)
('Eliza', 0.7981600761413574)

Слово «ночь» появляется в нашем лексиконе, но слово «ночи» не будет, потому что к тексту применена лемматизация. Несмотря на это, сходство между ними все же сохраняется.

True
False
0.9941722
0.9990338

Использованная литература:

[1] Лев Константиновский — Текстовое сходство со следующим поколением встраивания слов в Gensim