在应用机器学习算法来处理单词或短文本时,我们通常需要首先获取它们的数字嵌入向量。
一些强大的方法包括使用预训练的深度学习模型(例如 BERT)来进行更多语义嵌入。如果计算资源有限,或者我们想要更简单的嵌入方法,我们可以尝试 TF-IDF 指标。
这里我们介绍一种非常简单的方法,将字符级别的 n-gram 方法和 TF-IDF 结合起来,将诸如几个单词之类的短文本转换为数字向量。在数字向量中,我们可以进一步将分类方法(例如梯度提升机)应用于下游任务。
首先,让我们回顾一下什么是 n-gram:
引用 Wikipedia N-Gram 页面中的一些定义:
…n-gram 是来自给定文本或语音序列的 n 个项目的连续序列。根据应用,这些项目可以是音素、音节、字母、单词……大小为 1 的 n-gram 称为“unigram”;大小 2 是“bigram”;大小 3 是一个“3-gram”。较大的尺寸有时由 n 的值来表示,例如“4-gram”、“5-gram”等。
到目前为止,两种最常见的 N-Gram 类型是(1)字符级,其中项目由一个或多个字符组成;(2)词级,其中项目由一个或多个单词组成。项目(或通常称为标记)的大小由 n 定义;
其次,什么是 TF-IDF 指标?
TF-IDF(Term Frequency - Inverse Document Frequency)编码是BOW(bag of words)的一种改进方式,与TF相同。它认为各种文档中经常出现的术语不太重要。
TF(词频):计算文档中存在多少词
IDF(逆文档频率):与包含该术语的文档数量的倒数
所以 TF-IDF 基本上是 TF 和 IDF 度量的产物。
事实证明,使用 scikit-learn 包实现短文本的字符级 n-gram TF-IDF 编码非常简单。
这意味着我们可以轻松地将流程步骤合并到我们的数据流程和特征工程管道中.
第一步 , Fit character n-gram tf idf vectorizer with training data
# using gram of length at 2 for example
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ['great people', 'feel happy', 'nice work','warm weather']
vectorizer = TfidfVectorizer(analyzer='char', ngram_range=(2,2)).fit(corpus)
print(vectorizer.get_feature_names())
[' h', ' p', ' w', 'ap', 'ar', 'at', 'ce', 'e ', 'ea', 'ee', 'el', 'eo', 'er', 'fe', 'gr', 'ha', 'he', 'ic', 'l ', 'le', 'm ', 'ni', 'op', 'or', 'pe', 'pl', 'pp', 'py', 're', 'rk', 'rm', 't ', 'th', 'wa', 'we', 'wo']
第二步, Transform new text to tf-idf weighted vector
new_text = ['pineapple milk']
tfidf_vector = vectorizer.transform(new_text).toarray()
print(tfidf_vector)
[[0. 0. 0. 0.42176478 0. 0.
0. 0.42176478 0.3325242 0. 0. 0.
0. 0. 0. 0. 0. 0.
0. 0.42176478 0. 0. 0. 0.
0. 0.42176478 0.42176478 0. 0. 0.
0. 0. 0. 0. 0. 0. ]]
同时推荐个网站:
data science by example
AI研究企业新闻