在自然语言处理(NLP)中,特征提取是一个关键步骤,它涉及到将文本数据转换成机器可读的格式,即数值形式。这是因为算法和机器无法直接理解字符、单词或句子,因此需要将这些文本编码成特定的数值形式,以便与算法或机器进行交互。不能将包含单词/句子/字符的文本数据直接输入到机器学习模型中。
特征工程是自然语言处理中非常关键的一部分。由于机器学习模型无法直接处理文本数据,需要将文本中的单词、句子或字符编码成数值形式。有多种方法可以执行特征提取,其中一些流行且常用的方法包括:词袋模型(Bag of Words, BOW)、TF-IDF等。
词袋模型是最简单的模型之一。想象一下,一个句子就像一个装满单词的袋子。这个模型的核心思想是统计整个文本数据中每个单词的出现频率,并将单词与其频率映射起来。这种方法不考虑单词的顺序,但它确实关心单词出现的次数,并且默认情况下,词袋模型对所有单词都一视同仁。
!pip install sklearn
import sklearn
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
text = ["爱NLP", "NLP是未来", "将在2个月内学会"]
count_matrix = vectorizer.fit_transform(text)
count_array = count_matrix.toarray()
df = pd.DataFrame(data=count_array, columns=vectorizer.get_feature_names())
print(df)
在上面的代码中,首先使用`CountVectorizer`来实现词袋模型。`fit_transform()`方法首先拟合数据到`CountVectorizer`,然后将其转换为特征,而`get_feature_names()`方法返回唯一单词的词汇表。一旦`CountVectorizer`拟合完成,它就不会更新词袋模型。
词袋模型的结果并不总是理想的,因为它有一个缺点。假设有一个特定的词在所有文档中都出现,并且出现多次,那么它将具有更高的出现频率,这将导致这个词在句子中的权重更大,这不利于分析。TF-IDF的概念是通过规范化在文档集合中频繁出现的词来反映一个词对其文档或句子的重要性。
import sklearn
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
text = ["爱NLP", "NLP是未来", "将学习NLP"]
vectorizer = TfidfVectorizer()
matrix = vectorizer.fit_transform(text)
count_array = matrix.toarray()
df = pd.DataFrame(data=count_array, columns=vectorizer.get_feature_names())
print(df)
import numpy as np
glove_vectors = dict()
file = open('../input/glove6b/glove.6B.100d.txt', encoding='utf-8')
for line in file:
values = line.split()
word = values[0]
vectors = np.asarray(values[1:])
glove_vectors[word] = vectors
file.close()
vec_dimension = 100
def get_vec(x):
arr = np.zeros(vec_dimension)
text = str(x).split()
for t in text:
try:
vec = glove_vectors.get(t).astype(float)
arr = arr + vec
except:
pass
arr = arr.reshape(1,-1)[0]
return(arr/len(text))
document = ['爱', '爱NLP,将尝试学习', '这是词嵌入']
features = get_vec(document)
features