在自然语言处理(NLP)领域,特征提取是理解文本内容的关键步骤之一。文本清洗后,需要将其转换为模型可用的特征,这个过程通常被称为文档数据的特征提取,也称为文本表示或文本向量化。文档数据本身不可计算,因此必须将其转换为数值数据,如向量空间模型。本文将探讨不同的特征提取技术,如词袋模型(Bag of Words)、TF-IDF、n-gram、word2vec等。
如果拥有文本数据,这些数据不能直接用于任何机器学习算法,因为机器学习算法不理解文本数据,它们只理解数值数据。将文本数据转换为数值的过程称为文本的特征提取,也称为文本向量化。
机器只能理解数字,要使机器能够识别语言,需要将其转换为数值形式。这就是为什么需要特征提取。
特征提取在NLP中是困难的。与图像数据集相比,图像特征提取相对容易,因为图像已经是数字形式(像素)。音频数据,如从语音识别中预测情绪,数据以波形信号的形式存在,可以在一定时间间隔内提取特征。但是,当有一句话并想要预测其情感时,如何用数字表示它?本文将研究这些技术。
以下是一些常见的特征提取技术:
独热编码意味着将文档中的词汇转换为V维向量。这种技术非常直观,意味着它简单,可以自己编码。这是独热编码的唯一优势。
# 示例代码
# 假设有以下文档
documents = ["We are learning Natural Language Processing", "We are learning Data Science", "Natural Language Processing comes under Data Science"]
# 词汇表(Unique words) - We are learning Natural Language Processing Data Science comes under - V - 10
独热编码不用于工业界,因为它有缺陷,如创建稀疏性、文档大小不一、词汇表外(OOV)问题以及不捕获语义意义。
词袋模型是最常用的文本向量化技术之一。词袋模型描述了文档中词汇的出现情况。特别用于文本分类任务。可以直接使用Scikit-learn的CountVectorizer类。
# 示例代码
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)
词袋模型简单直观,文档大小一致,不会出现OOV问题。但是,它也会产生稀疏性,忽略新词汇,不考虑句子顺序问题。
n-gram模型将文本文档表示为其n-gram的无序集合。包括二元组(bi-gram)、三元组(tri-gram)和n元组(n-gram)。
# 示例代码
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(ngram_range=(2, 2))
X = vectorizer.fit_transform(documents)
n-gram模型简单易实现,能够捕获句子的语义意义。但是,从unigram到N-gram,向量形成的维度增加,会减慢算法速度,并且忽略新词汇。
TF-IDF是一种统计度量,评估一个词对文档在文档集合中的相关性。词频(TF)是文档中某个词出现的次数除以该文档的总词数。逆文档频率(IDF)是文档集合中文档总数的对数除以包含特定词的文档数。
# 示例代码
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents)
TF-IDF在信息检索中广泛使用,如搜索引擎。但是,它会产生稀疏性,如果数据集很大,维度会增加,减慢算法速度,并且忽略新词汇,不捕获语义意义。
使用领域知识创建新的自定义特征。例如,文档中的词数、负词数、正负评价比例、词数、字符数等。
# 示例代码
from gensim.models import Word2Vec
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)