Мішок Слів
Розуміння моделі BoW
Модель "мішок слів" (BoW) представляє документи у вигляді векторів, де кожен вимір відповідає унікальному слову. Кожен вимір може відображати наявність слова в документі (1 — якщо присутнє, 0 — якщо відсутнє) або його частоту (кількість разів, коли слово зустрічається). Таким чином, моделі BoW можуть бути бінарними або частотними.
Розглянемо, як одне й те саме речення (документ) представляється кожним типом:
Бінарна модель представляє цей документ у вигляді вектора [1, 1, 1], тоді як частотна модель — як [2, 1, 2], враховуючи частоту слів.
Реалізація BoW
Реалізація моделі BoW є досить простою, особливо за допомогою бібліотеки sklearn (scikit-learn) та її класу CountVectorizer.
Нижче наведено реалізацію бінарної моделі "мішок слів":
12345678910111213from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a binary Bag of Words model vectorizer = CountVectorizer(binary=True) # Generate a BoW matrix bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix into a dense array print(bow_matrix.toarray())
Кожен рядок у матриці відповідає документу, а кожен стовпець — токену (слову). Для візуального представлення ми перетворили цю розріджену матрицю у щільний двовимірний масив за допомогою методу .toarray().
Розріджена матриця — це матриця, у якій більшість елементів дорівнюють нулю. Вона використовується для ефективного представлення та обробки даних із великою кількістю нульових значень, економлячи пам’ять і обчислювальні ресурси шляхом зберігання лише ненульових елементів.
Щоб створити частотну модель «мішок слів», достатньо видалити параметр binary=True, оскільки його значення за замовчуванням — False:
1234567891011from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a frequency-based Bag of Words model vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) print(bow_matrix.toarray())
Перетворення матриці у DataFrame
Зручно перетворити отриману матрицю «мішка слів» у pandas DataFrame. Крім того, екземпляр CountVectorizer має метод get_feature_names_out(), який повертає масив унікальних слів (імен ознак), що використовуються у моделі. Ці імена ознак можна використовувати як стовпці DataFrame:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix to a DataFrame bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) print(bow_df)
Завдяки цьому представленню тепер можна легко отримати не лише вектор для окремого документа, а й вектор для окремого слова:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # Print the vector for 'global' as a NumPy array print(f"Vector for the word 'global': {bow_df['global'].values}")
Оскільки кожне унікальне слово відповідає стовпцю, доступ до вектору слова здійснюється так само просто, як доступ до стовпця у DataFrame шляхом вказання слова (наприклад, 'global'). Також використовується атрибут values, щоб отримати масив замість Series як результат.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you explain the difference between binary and frequency-based BoW models in more detail?
How does the CountVectorizer handle punctuation and capitalization?
Can you show how to access the vector for a different word in the DataFrame?
Awesome!
Completion rate improved to 3.45
Мішок Слів
Свайпніть щоб показати меню
Розуміння моделі BoW
Модель "мішок слів" (BoW) представляє документи у вигляді векторів, де кожен вимір відповідає унікальному слову. Кожен вимір може відображати наявність слова в документі (1 — якщо присутнє, 0 — якщо відсутнє) або його частоту (кількість разів, коли слово зустрічається). Таким чином, моделі BoW можуть бути бінарними або частотними.
Розглянемо, як одне й те саме речення (документ) представляється кожним типом:
Бінарна модель представляє цей документ у вигляді вектора [1, 1, 1], тоді як частотна модель — як [2, 1, 2], враховуючи частоту слів.
Реалізація BoW
Реалізація моделі BoW є досить простою, особливо за допомогою бібліотеки sklearn (scikit-learn) та її класу CountVectorizer.
Нижче наведено реалізацію бінарної моделі "мішок слів":
12345678910111213from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a binary Bag of Words model vectorizer = CountVectorizer(binary=True) # Generate a BoW matrix bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix into a dense array print(bow_matrix.toarray())
Кожен рядок у матриці відповідає документу, а кожен стовпець — токену (слову). Для візуального представлення ми перетворили цю розріджену матрицю у щільний двовимірний масив за допомогою методу .toarray().
Розріджена матриця — це матриця, у якій більшість елементів дорівнюють нулю. Вона використовується для ефективного представлення та обробки даних із великою кількістю нульових значень, економлячи пам’ять і обчислювальні ресурси шляхом зберігання лише ненульових елементів.
Щоб створити частотну модель «мішок слів», достатньо видалити параметр binary=True, оскільки його значення за замовчуванням — False:
1234567891011from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a frequency-based Bag of Words model vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) print(bow_matrix.toarray())
Перетворення матриці у DataFrame
Зручно перетворити отриману матрицю «мішка слів» у pandas DataFrame. Крім того, екземпляр CountVectorizer має метод get_feature_names_out(), який повертає масив унікальних слів (імен ознак), що використовуються у моделі. Ці імена ознак можна використовувати як стовпці DataFrame:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix to a DataFrame bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) print(bow_df)
Завдяки цьому представленню тепер можна легко отримати не лише вектор для окремого документа, а й вектор для окремого слова:
12345678910111213from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # Print the vector for 'global' as a NumPy array print(f"Vector for the word 'global': {bow_df['global'].values}")
Оскільки кожне унікальне слово відповідає стовпцю, доступ до вектору слова здійснюється так само просто, як доступ до стовпця у DataFrame шляхом вказання слова (наприклад, 'global'). Також використовується атрибут values, щоб отримати масив замість Series як результат.
Дякуємо за ваш відгук!