Відома утиліта дистрибутивної семантики Word2Vec демонструє дивовижні результати і стабільно забезпечує призовими місцями на конкурсах машинної лінгвістики. Перевага утиліти, як втім, і її аналогів - Glove і AdaGram, полягає в дешевизні процесу навчання і підготовки навчальних текстів. Але є й недоліки - уявлення слів у вигляді векторів добре працює на словах, задовільно на словосполученнях, так-собі на фразах і взагалі ніяк - на довгих текстах.
У цій статті пропонується до обговорення підхід, що дозволяє представити текст будь-якої довжини у вигляді вектора, що дозволяє проводити з текстами операції порівняння (обчислення дистанції), додавання і віднімання.
Від векторних репрезентацій до семантичного вектору
Векторні репрезентації слів, отриманих у результаті роботи Word2Vec, мають таку цікаву властивість - сенс мають тільки відстані між векторами, а не самі вектори. Іншими словами - розкласти саму векторну репрезентацію конкретного слова на складові і вивчити її представляється важкорозв'язним завданням. В першу чергу тому, що процес навчання стартує з якихось випадкових початкових векторів і більше того, сам процес навчання випадковий. Його випадковість пов'язана з принципом стохастичного навчання, коли потоки навчання, що паралельно виконуються, не синхронізують внесені зміни один з одним, реалізуючи в чистому вигляді гонку даних. Але якості навчання ця гонка суттєво не знижує, тоді як швидкість навчання збільшується досить помітно. Саме завдяки випадковій структурі алгоритму і даних - векторна репрезентація слова не розкладається на осмислені складові і може використовуватися тільки в цілому.
Негативним ефектом зазначеної властивості векторної репрезентації є швидка деградація векторів при операціях над ними. Складання векторів двох слів зазвичай демонструє те загальне, що є між цими словами (якщо слова дійсно пов'язані в реальному світі), але спроба збільшити кількість доданків дуже швидко призводить до втрати будь-якого практично цінного результату. Скласти слова однієї фрази - ще можна, декількох фраз - вже немає. Необхідний інший підхід.
З точки зору обивательської логіки, як можна описати який-небудь текст? Спробувати вказати його тематику, може бути - сказати пару слів про стиль. Тексти, присвячені автомобілям, очевидно, будуть містити досить велику кількість слів «автомобіль» і близьких до нього, можуть містити слово «спорт», назви автомобільних марок і так далі. З іншого боку, тексти на іншу тематику будуть містити подібних слів набагато менше або не містити зовсім. Таким чином, перерахувавши достатню кількість можливих тематик тексту, ми можемо порахувати статистику наявності в тексті відповідних кожній тематиці слів і отримати семантичний вектор тексту - вектор, кожен елемент якого позначає відношення даного тексту до тематики, кодованої цим елементом.
Стиль тексту, у свою чергу теж визначається статистичними методами - це характерні для автора слова паразити і мовні оберти, специфіка початку фраз і розстановки знаків пунктуації. Оскільки ми при навчанні поділяємо заголовні і прописні літери і не прибираємо з тексту знаки пунктуації, то словник Word2Vec сповнений словами типу «тексту», - саме так, з комою. І саме такі слова і можуть використовуватися для виділення авторського стилю. Зрозуміло, для стійкого виділення стилю необхідні дійсно величезні текстові корпуси, або, як мінімум, дуже оригінальний авторський стиль, але, тим не менш, відрізнити газетну замітку від запису на форумі або твіту нескладно.
Таким чином, для побудови семантичного вектора тексту необхідно описати достатню кількість стійких кластерів, що відображають тематику та стиль тексту. У самій утиліті Word2Vec є вбудований кластеризатор на основі kMeans, ним і скористаємося. Кластеризатор поділить всі слова зі словника на задану кількість кластерів, і, якщо кількість кластерів буде досить великою, можна очікувати, що кожен кластер буде вказувати на досить вузьку тематику тексту, а точніше - на вузьку ознаку тематики або стилю. У своєму завданні я використовував дві тисячі кластерів. Тобто - довжина семантичного вектора тексту становить дві тисячі елементів, і кожен елемент цього вектора може бути пояснений через відповідні до цього кластеру слова.
Відносна щільність слів з кожного кластера в досліджуваному тексті добре описує текст. Зрозуміло, кожне конкретне слово має відношення до багатьох кластерів, до якихось більше, до якихось менше. Тому, в першу чергу необхідно обчислити семантичний вектор слова - як вектор, що описує відстань від слова до центру відповідного кластеру в векторному просторі Word2Vec. Після чого, складаючи семантичні вектори окремих слів, що складають текст, ми отримуємо семантичний вектор всього тексту.
Описаний алгоритм, заснований на обчисленні відносної частоти слів, що задають відповідні тематики, хороший тим, що підходить для текстів будь-якої довжини. Від одного слова і до нескінченності. При цьому, як ми знаємо, важко знайти досить довгий текст однієї тематики, часто тематика тексту змінюється від його початку до кінця. Короткий текст, або повідомлення, навпаки, не може охопити безліч тем саме за рахунок своєї кратості. Як підсумок, виходить, що семантичний вектор довгого тексту відрізняється ознаками декількох тем від короткого тексту, в яких ознак тем набагато менше, але вони представлені набагато сильніше. Довжина тексту явно не враховується, проте алгоритм надійно розводить короткі і довгі тексти в векторному просторі.
Як використовувати семантичний вектор тексту?
Оскільки кожному тексту поставлено відповідність вектор у семантичному просторі, ми можемо обчислити відстань між будь-якими двома текстами як косинусну міру між ними. Ви можете використовувати алгоритм kMeans для кластеризації або класифікації. Тільки цього разу - вже у векторному просторі текстів, а не окремих слів. Наприклад, якщо у нас стоїть завдання відфільтрувати з потоку текстів (новини, форуми, твіти і т. д.) тільки які мають цікаву нас тематику, можна підготувати базу заздалегідь розмічених текстів, а для кожного досліджуваного тексту обчислювати клас, до якого він тяжіє найбільше (максимум усередненої косинусної міри за кількома кращими входженнями кожного класу - kMeans в чистому вигляді).
У зазначений спосіб було успішно вирішено досить складне завдання класифікації текстів на велику (кілька сотень) кількість класів, при значній відмінності текстів за стилем (різні джерела, довжина, навіть мови повідомлень) і при наявності тематичної зв'язаності класів (один текст часто може мати відношення до декількох класів). На жаль, конкретні цифри отриманих результатів знаходяться під NDA, але загальна результативність підходу наступна - 90% точності на 9% класів, 99% точності на 44% класів, 76% точності на 3% класів. Ці результати слід інтерпретувати наступним чином - класифікатор сортує всі кілька сотень цільових класів з оцінки ступеня відповідності тексту даному класу, після чого, якщо ми візьмемо топ 3% класів, то цільовий клас виявиться в цьому списку з 76% ймовірністю, а на 9% класів ймовірність вже перевищить 90%. Без перебільшення, це дивовижний за силою результат, що має велику практичну користь для замовника.
Детальніша доповідь з детальним описом алгоритму, формулами, графіком і результатами я запрошую вас послухати на найближчому Діалозі.
Як ще використовувати семантичний вектор?
Семантичний вектор тексту, як вже згадувалося, складається з осмислених (ніхто не буде осмислювати всі дві тисячі елементів вектора, але це можливо) елементів. Так, вони не є незалежними, але, тим не менш, є готовим до використання вектором ознак, який можна завантажити у ваш улюблений універсальний класифікатор - SVM, дерева або глибокі сітки.
Висновки
Метод перетворення тексту довільної довжини на вектор з опорою на векторні репрезентації слів Word2Vec дійсно працює і дає хороші результати в завданнях кластеризації та класифікації текстів. Ознаки тексту, кодовані семантичним вектором, не деградують зі збільшенням довжини тексту, а навпаки - дозволяють більш тонко диференціювати довгі тексти один від одного і сильно розводять тексти з істотно різною довжиною. Загальний обсяг обчислень скромний - один місяць на нормальному сервері.
З радістю відповім на ваші запитання в коментарях.






