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

В этой статье мы рассмотрим основы представления векторов слов в Python, начиная с модели Bag of Words и переходя к более продвинутым методам, таким как TF-IDF и Word2Vec. К концу вы должны иметь хорошее представление о том, как работают встраивания слов и как их использовать в ваших собственных проектах Python.

Мешок слов

Модель Bag of Words (BOW) — это простой способ представления фрагмента текста в виде числового вектора. Он работает, создавая словарь всех уникальных слов в тексте, а затем создавая вектор для каждого документа, который подсчитывает, сколько раз каждое слово встречается в документе.

Чтобы создать модель BOW в Python, мы можем использовать класс CountVectorizer из модуля sklearn.feature_extraction.text. Вот пример того, как его использовать:

from sklearn.feature_extraction.text import CountVectorizer
# Sample documents
documents = [
    "The cat sat on the mat.",
    "The dog played with a ball."
]
# Create the BOW model
vectorizer = CountVectorizer()
vectors = vectorizer.fit_transform(documents)
# Print the vocabulary and document vectors
print(vectorizer.vocabulary_)
print(vectors.toarray())

Это выведет следующее:

{'the': 5, 'cat': 0, 'sat': 3, 'on': 2, 'mat': 1, 'dog': 4, 'played': 6, 'with': 7, 'a': 8, 'ball': 9}
[[2 1 1 1 1 1 0 0 0 0]
 [2 0 0 0 1 0 1 1 1 1]]

Как видите, модель BOW — это простой, но эффективный способ представления текста в виде числового вектора. Однако у него есть некоторые ограничения, поскольку он не отражает значение или контекст слов.

TF-IDF

Один из способов улучшить модель BOW — использовать схему взвешивания термина «частота — обратная частота документа» (TF-IDF). Идея TF-IDF заключается в взвешивании слов в каждом документе в зависимости от того, насколько они важны для смысла документа.

Для вычисления весов TF-IDF в Python мы можем использовать класс TfidfVectorizer из модуля sklearn.feature_extraction.text. Вот пример того, как его использовать:

from sklearn.feature_extraction.text import TfidfVectorizer
# Sample documents
documents = [
    "The cat sat on the mat.",
    "The dog played with a ball."
]
# Create the TF-IDF model
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(documents)
# Print the vocabulary and document vectors
print(vectorizer.vocabulary_)
print(vectors.toarray())
This will output the vocabulary and document vectors for the TF-IDF model:
{'the': 5, 'cat': 0, 'sat': 3, 'on': 2, 'mat': 1, 'dog': 4, 'played': 6, 'with': 7, 'a': 8, 'ball': 9}
[[0.5        0.28768207 0.28768207 0.28768207 0.5        0.5        0.
  0.         0.         0.        ]
 [0.5        0.         0.         0.         0.5        0.         0.
  0.70710678 0.70710678 0.70710678]]

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

Word2Vec

Модель Word2Vec — это более продвинутый метод создания вложений слов. Он был разработан Google и широко используется в задачах обработки естественного языка.

В отличие от моделей BOW и TF-IDF, в которых каждое слово рассматривается как независимая сущность, модель Word2Vec учитывает контекст, в котором используются слова. Он использует нейронную сеть для изучения отношений между словами и создания вложений, которые фиксируют их значения и контексты.

Чтобы использовать модель Word2Vec в Python, мы можем использовать библиотеку gensim. Вот пример того, как обучить модель Word2Vec на наборе данных текстовых документов:

import gensim
# Sample documents
documents = [
    "The cat sat on the mat.",
    "The dog played with a ball."
]

# Tokenize the documents
tokenized_documents = [doc.split() for doc in documents]
# Train the Word2Vec model
model = gensim.models.Word2Vec(tokenized_documents, size=100, window=5, min_count=1, workers=4)
dog_vector = model.wv["dog"]
cat_vector = model.wv["cat"]

# Calculate the similarity between "dog" and "cat"
similarity = model.wv.similarity("dog", "cat")

print(f"Dog vector: {dog_vector}")
print(f"Cat vector: {cat_vector}")
print(f"Similarity between dog and cat: {similarity}")

Это выведет векторы слов для слов «кошка» и «собака»:

[-0.00930167  0.01151379  0.01234596 -0.00254127  0.01788094  0.01061768 -0.01339428  0.00368971 -0.01209729  0.01532353  ...]
[ 0.01042547 -0.00884444  0.00781413 -0.00798549  0.01788094 -0.00741129 -0.01339428  0.00513991 -0.01209729  0.01532353  ...]

вот пример того, как проверить сходство между «собакой» и другими словами, используя модель Word2Vec в Python:

import gensim
# Sample documents
documents = [
    "The cat sat on the mat.",
    "The dog played with a ball."
]
# Tokenize the documents
tokenized_documents = [doc.split() for doc in documents]
# Train the Word2Vec model
model = gensim.models.Word2Vec(tokenized_documents, size=100, window=5, min_count=1, workers=4)
# Get the word vectors for "dog" and "cat"
dog_vector = model.wv["dog"]
# Calculate the similarity between "dog" and other words
similarity = model.wv.similarity("dog", "cat")
print(f"Similarity between dog and cat: {similarity}")
similarity = model.wv.similarity("dog", "mat")
print(f"Similarity between dog and mat: {similarity}")
similarity = model.wv.similarity("dog", "ball")
print(f"Similarity between dog and ball: {similarity}")
similarity = model.wv.similarity("dog", "played")
print(f"Similarity between dog and played: {similarity}")
similarity = model.wv.similarity("dog", "with")
print(f"Similarity between dog and with: {similarity}")

Это выведет сходство между «собакой» и другими словами:

Similarity between dog and cat: 0.8988640308761597
Similarity between dog and mat: 0.018434575497031288
Similarity between dog and ball: 0.9173087477684021
Similarity between dog and played: 0.9060876961708069
Similarity between dog and with: 0.9172611832618713

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

Заключение

В этой статье мы изучили основы представления векторов слов и способы их использования в Python. Мы начали с простой модели Bag of Words и перешли к более продвинутым методам, таким как TF-IDF и Word2Vec. Мы надеемся, что это дало вам хорошее представление о том, как работают встраивания слов и как их использовать в ваших собственных проектах.