自然语言处理:文本预处理与向量化实战

本文将介绍如何使用 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)

代码解释

  1. 读取文本文件内容: 使用 Python 内置的 open 函数打开文本文件,将其中的内容读取出来,返回字符串格式的内容。
  2. 对文本内容进行分词处理: 使用 jieba 库进行中文分词,将每个文本文件中的内容进行分词处理,返回一个列表,其中每个元素代表一个分词结果。
  3. 对整个数据集进行分词处理: 遍历数据集中的每一个文本文件,将其中的内容进行分词处理,返回一个列表,其中每个元素代表一个文本文件的分词结果。
  4. 加载停用词表: 从文件中读取停用词表,返回一个集合。
  5. 进行停用词处理: 将分词结果中的停用词去除,返回一个新的分词结果列表。
  6. 将分词结果转换成字符串格式: 将分词结果列表转换成字符串格式,用空格隔开每个分词结果,返回一个字符串。
  7. 对整个数据集进行向量化处理: 使用 TfidfVectorizer 类进行文本向量化处理,将每个文本文件表示成一个向量,返回一个稀疏矩阵。
  8. 完整流程: 读取数据集 -> 分词处理 -> 停用词处理 -> 向量化处理。最终输出一个稀疏矩阵,其中每一行代表一个文本文件的向量表示。

结果

(200, 16434)

解释

数据集中包含 200 个文本文件,经过分词和停用词处理后,共有 16434 个不同的词汇,每个文本文件被表示成一个 16434 维的向量。

希望本文能帮助你了解自然语言处理中常见的文本预处理方法。如果你有任何问题,欢迎在评论区留言。

自然语言处理:文本预处理与向量化实战

原文地址: https://www.cveoy.top/t/topic/oc0u 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录