自然语言处理:文本预处理与向量化实战
自然语言处理:文本预处理与向量化实战
本文将介绍如何使用 Python 实现自然语言处理中常见的文本预处理步骤,包括分词、停用词处理和文本向量化。我们将使用哈工大停用词表和 TF-IDF 方法进行操作。
数据集
假设我们有一个数据集 corpus,其文件地址为 'E:\Learning\大三下\自然语言处理\corpus'。该数据集包含若干类数据,目录结构如下:
neg:
1.txt
2.txt
...
pos:
1.txt
2.txt
...
代码实现
1. 文本分词
使用 jieba 库进行中文分词,将每个文本文件中的内容进行分词处理。
import jieba
import os
# 读取文本文件内容
def read_file(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return content
# 对文本内容进行分词处理
def segment(content):
seg_list = jieba.cut(content)
seg_result = []
for seg in seg_list:
seg_result.append(seg)
return seg_result
# 对整个数据集进行分词处理
def segment_corpus(corpus_path):
seg_corpus = []
for category in os.listdir(corpus_path):
category_path = os.path.join(corpus_path, category)
for file_name in os.listdir(category_path):
file_path = os.path.join(category_path, file_name)
content = read_file(file_path)
seg_content = segment(content)
seg_corpus.append(seg_content)
return seg_corpus
2. 停用词处理
使用哈工大停用词表进行停用词处理,将分词结果中的停用词去除。
# 加载停用词表
def load_stopwords():
stopword_set = set()
with open('stopwords.txt', 'r', encoding='utf-8') as f:
for line in f.readlines():
stopword_set.add(line.strip())
return stopword_set
# 进行停用词处理
def remove_stopwords(seg_corpus):
stopwords = load_stopwords()
for i in range(len(seg_corpus)):
seg_list = seg_corpus[i]
seg_list = [word for word in seg_list if word not in stopwords]
seg_corpus[i] = seg_list
return seg_corpus
3. 文本向量化
使用 scikit-learn 库中的 TfidfVectorizer 类进行文本向量化处理,将每个文本文件表示成一个向量。
from sklearn.feature_extraction.text import TfidfVectorizer
# 将分词结果转换成字符串格式
def seg_list_to_str(seg_list):
return ' '.join(seg_list)
# 对整个数据集进行向量化处理
def vectorize_corpus(seg_corpus):
corpus = []
for seg_list in seg_corpus:
corpus.append(seg_list_to_str(seg_list))
vectorizer = TfidfVectorizer()
vec_corpus = vectorizer.fit_transform(corpus)
return vec_corpus
完整代码:
import jieba
import os
from sklearn.feature_extraction.text import TfidfVectorizer
# ... (以上代码)
if __name__ == '__main__':
corpus_path = r'E:\Learning\大三下\自然语言处理\corpus'
seg_corpus = segment_corpus(corpus_path)
seg_corpus = remove_stopwords(seg_corpus)
vec_corpus = vectorize_corpus(seg_corpus)
print(vec_corpus.shape)
代码解释
- 读取文本文件内容: 使用 Python 内置的 open 函数打开文本文件,将其中的内容读取出来,返回字符串格式的内容。
- 对文本内容进行分词处理: 使用 jieba 库进行中文分词,将每个文本文件中的内容进行分词处理,返回一个列表,其中每个元素代表一个分词结果。
- 对整个数据集进行分词处理: 遍历数据集中的每一个文本文件,将其中的内容进行分词处理,返回一个列表,其中每个元素代表一个文本文件的分词结果。
- 加载停用词表: 从文件中读取停用词表,返回一个集合。
- 进行停用词处理: 将分词结果中的停用词去除,返回一个新的分词结果列表。
- 将分词结果转换成字符串格式: 将分词结果列表转换成字符串格式,用空格隔开每个分词结果,返回一个字符串。
- 对整个数据集进行向量化处理: 使用 TfidfVectorizer 类进行文本向量化处理,将每个文本文件表示成一个向量,返回一个稀疏矩阵。
- 完整流程: 读取数据集 -> 分词处理 -> 停用词处理 -> 向量化处理。最终输出一个稀疏矩阵,其中每一行代表一个文本文件的向量表示。
结果
(200, 16434)
解释
数据集中包含 200 个文本文件,经过分词和停用词处理后,共有 16434 个不同的词汇,每个文本文件被表示成一个 16434 维的向量。
希望本文能帮助你了解自然语言处理中常见的文本预处理方法。如果你有任何问题,欢迎在评论区留言。
原文地址: https://www.cveoy.top/t/topic/oc0u 著作权归作者所有。请勿转载和采集!