складність 2/5 Безкоштовно
Bag of words
Текст як вектор підрахунків слів із викинутим порядком — досить грубо, щоб два речення з протилежним змістом злилися, досить корисно, щоб тридцять років бути типовим поданням.
Інтуїція
Модель хоче вектор чисел фіксованої довжини. Документ — це послідовність символів змінної довжини. Подання «мішок слів» розв’язує цю невідповідність найтупішим із доступних способів: виберіть словник, дайте кожному слову стовпець, а кожну клітинку заповніть тим, скільки разів це слово трапляється [2, §8.2.3.1].
Виживає підрахунок. Не виживає порядок — а в порядку живе неабияка частина змісту [1, §6.2]. Це звучить смертельно, але таким не є, бо для багатьох задач підрахунку досить [2, §8.2.3.7]. Чи відгук позитивний, до якої з двадцяти категорій належить стаття, чи два документи про одне й те саме: це здебільшого питання про те, які слова присутні, а слова всі досі на місці.
Це подання варто зрозуміти саме тому, що воно є нижньою межею. Усе пізніше в обробці природної мови є відповіддю на щось, що воно викидає, тож точне знання того, що саме воно викидає, каже вам, для чого решта галузі.
Формальне визначення
Назва прийшла з пошуку інформації, де вона описує те, що лишається від документа, коли ви тримаєте лише ваги його термів. Ці ваги «можна розглядати як кількісний витяг із того документа. У цьому погляді на документ, відомому в літературі як модель „мішка слів“, точний порядок термів у документі ігнорується, але кількість входжень кожного терма має значення» [1, §6.2].
Наслідок сформульовано настільки прямо, наскільки він на це заслуговує: документ «Мері швидша за Джона» є, у цьому погляді, тотожним документові «Джон швидший за Мері» [1, §6.2]. Два речення, протилежні твердження, один вектор.
Та сама ідея має друге, гостріше формулювання як імовірнісне припущення. У класифікації текстів вона з’являється як позиційна незалежність: умовна ймовірність терма однакова незалежно від того, де в документі він трапляється. Підручник робить цю тотожність явною — «позиційна незалежність рівнозначна прийняттю моделі „мішка слів“» [1, §13.4].
Це формулювання корисніше, бо воно каже, що саме припускають, а не що викидають, і воно приходить із чесним зізнанням: «насправді припущення про умовну незалежність не справджується для текстових даних. Терми умовно залежні один від одного» [1, §13.4]. Про цю модель відомо, що вона хибна. Її використовують, бо альтернатива — оцінювати кількість параметрів, експоненційну від розміру словника [1, §13.4].
З погляду реалізації конвеєр має три кроки — «токенізація рядків і надання цілого ідентифікатора кожному можливому токену», «підрахунок входжень токенів у кожному документі» та «нормалізація й зважування»; цю стратегію «називають поданням „мішок слів“ або „мішок n-грам“» [2, §8.2.3.1].
Як це працює
Матриця величезна й майже цілком порожня. Збірка з 10,000 коротких документів «використає словник розміром порядку 100,000 унікальних слів загалом, тоді як кожен документ окремо використає від 100 до 1000 унікальних слів», тож «утворена матриця матиме багато нульових значень ознак (зазвичай понад 99% з них)» [2, §8.2.3.2]. Зберігати її щільно — не варіант; розріджене зберігання тут не оптимізація, а єдиний спосіб, яким це подання взагалі існує.
Стандартний ремонт утраченого порядку — розширити одиницю. Рахуйте сусідні пари так само, як окремі слова — «мішок n-грам» того самого джерела [2, §8.2.3.1] — і Мері швидша стає самостійною ознакою. Це працює, і саме тому ця фраза є в назві. Це також множить словник, який і так був дорогою частиною, і відновлює порядок лише локально: біграмна модель усе одно не скаже, що підмет речення є тим, на що посилається його остання клауза.
Не кожне часте слово варто тримати. Деякі викидають одразу як стоп-слова, і «використання списку стоп-слів значно зменшує кількість записів, які система має зберігати» [1, §2.2.2]. Але від цієї практики тихо відмовилися: тенденція «йшла від стандартного вжитку досить великих списків стоп-слів (200-300 термів) до дуже малих списків (7-12 термів) і аж до жодного списку взагалі», і «вебпошуковики загалом не користуються списками стоп-слів» [1, §2.2.2]. Причина в тому, що tf-idf і так знижує їхню вагу, без ризику знищити запит на кшталт Бути чи не бути [1, §2.2.2].
Де застосовується
- Базові рівні класифікації тексту — спам, тональність, тема. Підрахунки плюс лінійна модель — це те число, з яким варто порівнювати кожен нейронний результат.
- Пошук, звідки це подання почалося: запит, «розглянутий як мішок слів», трактують «як дуже короткий документ» і оцінюють проти кожного іншого [1, §6.3.2].
- Дедуплікація й кластеризація, де два документи зі спільним словником зазвичай мають і спільний предмет.
- Будь-що без GPU й без часу. Матриця підрахунків і логістична регресія навчаються за секунди на ноутбуці, що й досі робить це правильною першою спробою.
- Нетекстові послідовності — товари в кошику, події в журналі, k-мери в геномі. Трюк не про мову; він про будь-яку множину, де належність важить більше за розташування.
Чому і коли
Починайте звідси щоразу, коли задача про тему чи лексику. Якщо людина могла б відповісти на питання, пробігши очима по словах, а не читаючи речення, підрахунки доведуть вас майже до кінця [2, §8.2.3.7].
Не беріть його, коли задача тримається на структурі — заперечення, хто що кому зробив, сарказм, будь-що, де два речення мають спільні слова й різняться твердженням. Це подання не може виразити різниці, тож жодна місткість моделі далі по конвеєру її не відновить [2, §8.2.3.8].
Додайте n-грами, перш ніж додавати нейронну мережу. Біграми дешеві й зберігають «частину локальної інформації про порядок» — приклад scikit-learn за біграмою is this відрізняє запитання від ствердження [2, §8.2.3.3], а не добре стає окремою ознакою, — а на задачах аналізу тональності дають стабільний виграш [3, Abstract].
Чекайте, що саме словник буде тим гіперпараметром, який важить. Мінімальна документна частота, максимальна документна частота й діапазон n-грам змінюють кількість ознак на порядки, і результат залежить від використаних ознак не менше, ніж від моделі [3, Abstract].
Практичний приклад
Власний приклад підручника, обчислений, а не заявлений, — плюс те, що з ним робить біграмне подання.
Python 32 рядки Показати код Сховати код
import numpy as np
docs = [
"Mary is quicker than John",
"John is quicker than Mary",
"Mary is slower than John",
]
toks = [d.lower().split() for d in docs]
def matrix(units):
vocab = sorted({u for row in units for u in row})
X = np.zeros((len(units), len(vocab)), dtype=int)
for i, row in enumerate(units):
for u in row:
X[i, vocab.index(u)] += 1
return vocab, X
vocab, X = matrix(toks)
print(" vocabulary:", vocab)
for d, row in zip(docs, X):
print(f" {d:<28} {row}")
print(f"\n rows 1 and 2 identical: {np.array_equal(X[0], X[1])}")
print(f" rows 1 and 3 identical: {np.array_equal(X[0], X[2])}")
bigrams = [[f"{r[i]}_{r[i+1]}" for i in range(len(r) - 1)] for r in toks]
bvocab, B = matrix(bigrams)
print(f"\n with bigrams ({len(bvocab)} features instead of {len(vocab)}):")
print(f" rows 1 and 2 identical: {np.array_equal(B[0], B[1])}")
print(" bigrams unique to row 1:", [bvocab[j] for j in np.where(B[0] > B[1])[0]])Вивід
vocabulary: ['is', 'john', 'mary', 'quicker', 'slower', 'than']
Mary is quicker than John [1 1 1 1 0 1]
John is quicker than Mary [1 1 1 1 0 1]
Mary is slower than John [1 1 1 0 1 1]
rows 1 and 2 identical: True
rows 1 and 3 identical: False
with bigrams (8 features instead of 6):
rows 1 and 2 identical: False
bigrams unique to row 1: ['mary_is', 'than_john']Третє речення є контролем, і саме воно робить перший результат точним. Поміняти
місцями два слова видно — slower є іншим стовпцем, ніж quicker, тож рядок
3 відрізняється. Поміняти місцями дві ролі невидно, бо ролі несе позиція, а
позиція — це рівно те, що було відкинуто.
Біграми розділяють рядки 1 і 2, і дві ознаки, які це роблять, — це mary_is і
than_john — пари, які існують лише тоді, коли підметом є Мері. Ось і весь
ремонт у мініатюрі: порядок відновили, зробивши трохи більшу одиницю тим, що
рахують. Зверніть увагу на ціну, однак. П’ятислівні речення над шестислівним
словником дали вісім біграмних ознак, і на справжньому корпусі саме це
відношення перетворює сто тисяч стовпців на мільйони.
Типові помилки
Будувати словник на тестовій вибірці. Словник — це параметр, вивчений із даних. Будувати його по всіх документах перед поділом означає пустити розподіл слів тестової вибірки в навчання.
Вважати, що високий підрахунок означає важливість. Найчастішим словом майже в будь-якому англійському документі є the. Сирі підрахунки ставлять його першим; це рівно та проблема, яку tf-idf і існує, щоб полагодити [1, §6.2.1].
Прибирати стоп-слова рефлекторно. Сучасна практика здебільшого цього не робить, а задачам, чутливим до фраз, це шкодить [1, §2.2.2].
Порівнювати документи сирим скалярним добутком. Довгі документи мають більші підрахунки всюди й виграють кожне порівняння. Спершу нормалізуйте.
Читати позиційну незалежність як твердження про мову. Це зручність моделювання, про яку відомо, що вона хибна [1, §13.4]; виправданням є кількість параметрів, а не лінгвістика.
Ще не прочитаноДочитайте сторінку до кінця — і вона вважатиметься прочитаною.
Зберігайте свій прогресЗ доступом назавжди кожна дочитана сторінка позначається, і ви продовжуєте з того місця, де зупинилися, на всіх своїх пристроях.
Відкрити доступПеревірте себе
3 запитання
Кожну відповідь пояснено: який розділ вона перевіряє і з якого джерела.
Джерела
- Introduction to Information Retrieval (2008)bookhttps://nlp.stanford.edu/IR-book/html/htmledition/irbook.html
- scikit-learn User Guide — Feature extraction from textdocs · звірено 2026-09-06https://scikit-learn.org/stable/modules/feature_extraction.html
- Baselines and Bigrams: Simple, Good Sentiment and Topic Classification (2012)paperhttps://aclanthology.org/P12-2018/