目 录CONTENT

文章目录

文本数据特征工程的七个技巧

Administrator
2025-10-19 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/7-feature-engineering-tricks-for-text-data/

原文作者:Iván Palomares Carrascosa


7 Feature Engineering Tricks for Text Data

引言

越来越多的基于人工智能和机器学习的系统依赖于文本数据——语言模型便是当今一个显著的例子。然而,至关重要的是,机器并非真正理解语言,而是理解数字。换句话说,通常需要一些特征工程步骤,将原始文本数据转化为这些系统可以消化并进行推理的有用的数值数据特征。

本文介绍了七个易于实现的文本数据特征工程技巧。根据提供给特定模型的数据的复杂性和要求,你可能需要一套程度不一的这些技巧。

  • 技巧 1 到 5 通常用于处理文本的经典机器学习,例如基于决策树的模型
  • 技巧 6 和 7 对于循环神经网络和Transformer等深度学习模型是不可或缺的,尽管技巧 2(词干提取和词形还原)可能仍然需要用来增强这些模型的性能。

1. 移除停用词

移除停用词有助于降低维度:这对于可能遭受所谓的维度灾难的某些模型来说是必不可少的。像冠词、介词和助动词等可能主要为数据增加噪声的常见词汇会被移除,从而只保留那些传达了源文本大部分语义的词汇。

以下是如何在短短几行代码中实现此操作的方法(你可以简单地将words替换为你自己的分词列表)。我们将使用NLTK来获取英语停用词列表:

import nltk 
nltk.download('stopwords') 
from nltk.corpus import stopwords 
words = ["this","is","a","crane", "with", "black", "feathers", "on", "its", "head"]
stop_set = set(stopwords.words('english')) 
filtered = [w for w in words if w.lower() not in stop_set] 
print(filtered)

2. 词干提取和词形还原

将词语简化为它们的词根形式可以帮助将变体(例如,动词的不同时态)合并为一个统一的特征。在基于文本嵌入的深度学习模型中,形态学方面通常会被捕获,因此很少需要此步骤。然而,当可用数据非常有限时,它仍然有用,因为它缓解了数据稀疏性,并促使模型关注核心词义,而不是吸收冗余的表示。

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem("running"))

3. 基于计数的向量:词袋模型

在经典机器学习中,将文本转化为数值特征的最简单方法之一是词袋(Bag of Words)方法。它简单地将词频编码成向量。结果是一个描述简单基线特征的二维词频计数数组:这对于捕获词语在文档间的总体出现和相关性是有益的,但其局限性在于它无法捕获理解语言的重要方面,如词序、上下文或语义关系。

对于不太复杂的文本分类模型,它仍然可能是一个简单而有效的方法。使用scikit-learn的实现如下:

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
print(cv.fit_transform(["dog bites man", "man bites dog", "crane astonishes man"]).toarray())

4. TF-IDF 特征提取

词频-逆文档频率(TF-IDF)长期以来一直是自然语言处理的基石方法之一。它超越了词袋模型,不仅考虑单个文本(文档)级别的词频,还考虑了它们在整个数据集级别的整体相关性。例如,在一个包含200个文本或文档的数据集中,在一个特定的、较小的文本子集中频繁出现但在现有200个文本中整体出现次数很少的词语被认为具有高度相关性:这就是逆频率背后的理念。因此,独特且重要的词语会被赋予更高的权重。

将此应用于以下包含三个文本的小型数据集时,每个文本中的每个词都会被分配一个介于0到1之间的TF-IDF重要性权重:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
print(tfidf.fit_transform(["dog bites man", "man bites dog", "crane astonishes man"]).toarray())

5. 基于句子的 N-gram

基于句子的n-gram有助于捕获词语之间的相互作用,例如,“new”和“york”。使用scikit-learn中的CountVectorizer类,我们可以通过设置ngram_range参数来捕获短语级别的语义,以包含多个词的序列。例如,将其设置为(1,2)会创建与单个词(unigrams)和两个连续词(bigrams)相关的特征。

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(ngram_range=(1,2))
print(cv.fit_transform(["new york is big", "tokyo is even bigger"]).toarray())

6. 清洗与分词

尽管在像Transformers这样的Python库中存在许多专门的分词算法,但它们所基于的基本方法包括去除下游模型可能无法理解的标点符号、大小写和其他符号。一个简单的清洗和分词流程可以包括将文本拆分成词语、转换为小写,并移除标点符号或其他特殊字符。结果是一系列干净、标准化的词单元或令牌。

用于处理正则表达式的re库可用于构建如下简单的分词器:

import re
text = "Hello, World!!!"
tokens = re.findall(r'\b\w+\b', text.lower())
print(tokens)

7. 密集特征:词嵌入

最后,当今将文本转化为机器可读信息的最突出和最强大的方法之一是词嵌入。它们非常擅长捕获语义,例如,具有相似含义的词语,如“shogun”和“samurai”,或“aikido”和“jiujitsu”,它们被编码为数值上相似的向量(嵌入)。本质上,单词使用像Word2Vec或spaCy这样的预定义方法映射到向量空间:

import spacy
# Use a spaCy model with vectors (e.g., "en_core_web_md")
nlp = spacy.load("en_core_web_md")
vec = nlp("dog").vector
print(vec[:5]) # we only print a few dimensions of the dense embedding vector

每个词被转换成的嵌入向量的输出维度由所使用的特定嵌入算法和模型决定。

总结

本文展示了在使用文本数据进行文本分类和摘要等自然语言处理任务的机器学习和深度学习模型时,使原始文本数据有意义的七个有用技巧。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区