在自然语言处理(NLP)领域,文本数据是一种重要的信息载体。然而,计算机无法直接理解文本的语义,因此需要将文本转换为计算机能够处理的数值形式,这就是文本表示的任务。词袋模型(Bag-of-Words, BoW)是一种简单而有效的文本表示方法,它忽略文本中的语法和词序,仅考虑每个词在文本中出现的频率。本文将详细介绍词袋模型的原理,并通过代码演示如何构建词袋向量。
词袋模型的核心思想是将文本看作一个无序的词集合,就像一个袋子里装着各种不同的词。具体步骤如下:
假设有以下两个文本:
将所有词收集起来并去重,得到词汇表:[“I”, “love”, “natural”, “language”, “processing”, “machine”, “learning”]
文本 1 的词频统计:
| 词 | 出现次数 |
| —- | —- |
| I | 1 |
| love | 1 |
| natural | 1 |
| language | 1 |
| processing | 1 |
| machine | 0 |
| learning | 0 |
文本 2 的词频统计:
| 词 | 出现次数 |
| —- | —- |
| I | 1 |
| love | 1 |
| natural | 0 |
| language | 0 |
| processing | 0 |
| machine | 1 |
| learning | 1 |
下面我们使用 Python 代码来实现上述词袋模型的构建过程。
from collections import Counter
# 定义文本数据
texts = [
"I love natural language processing",
"I love machine learning"
]
# 步骤 1: 分词
tokenized_texts = [text.split() for text in texts]
# 步骤 2: 构建词汇表
vocab = set()
for tokens in tokenized_texts:
vocab.update(tokens)
vocab = sorted(vocab)
# 步骤 3 和 4: 构建词袋向量
bow_vectors = []
for tokens in tokenized_texts:
counter = Counter(tokens)
vector = [counter[word] for word in vocab]
bow_vectors.append(vector)
# 输出结果
print("词汇表:", vocab)
for i, vector in enumerate(bow_vectors):
print(f"文本 {i+1} 的词袋向量:", vector)
split()
方法将每个文本拆分成词列表。set()
去除重复的词,然后使用 sorted()
对词汇表进行排序。Counter()
统计每个词的出现次数,然后按照词汇表的顺序构建词袋向量。词袋模型是一种简单而有效的文本表示方法,它通过统计词的频率将文本转换为向量。虽然词袋模型存在一些缺点,但在一些简单的 NLP 任务中仍然具有广泛的应用。通过本文的介绍和代码演示,相信你已经对词袋模型有了更深入的理解。在实际应用中,可以根据具体任务的需求选择合适的文本表示方法。