📢 转载信息
原文链接:https://machinelearningmastery.com/7-feature-engineering-tricks-for-text-data/
原文作者:Iván Palomares Carrascosa
如今,越来越多的AI和机器学习系统依赖于文本数据——语言模型就是一个显著的例子。然而,至关重要的是,机器并不能真正理解语言,它们只理解数字。换句话说:通常需要一些特征工程步骤,将原始文本数据转换为这些系统可以消化并进行推理的有用数值数据特征。
本文介绍了七个易于实现的文本数据特征工程技巧。根据要输入数据的特定模型的复杂性和需求,您可能需要采用一套或多或少更雄心勃勃的技巧。
- 技巧 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
# 使用带有向量的 spaCy 模型(例如,“en_core_web_md”)
nlp = spacy.load("en_core_web_md")
vec = nlp("dog").vector
print(vec[:5]) # 我们只打印密集嵌入向量的几个维度
每个词转换成的嵌入向量的输出维度由所使用的特定嵌入算法和模型决定。
总结
本文展示了在使用文本数据进行机器学习和深度学习模型(执行自然语言处理任务,如文本分类和摘要)时,使原始文本数据有意义的七个有用技巧。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区