①机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
简介: 机器学习之自然语言处理——基于TfidfVectorizer和CountVectorizer及word2vec构建词向量矩阵(代码+原理)

理论知识准备

前期我们对分词进行了详细的讲解,那么分词之后,哪些关键词对一个文档才是重要的?比如可以通过单词出现的次数,次数越多就表示越重要。

构造文本特征向量

Count (文档:空格连接的字符串)


TFIDF (文档:空格连接的字符串)


Word2Vec (文档:分词列表)


TF-IDF 值

单词的TF-IDF 值可以描述一个单词对文档的重要性,TF-IDF 值越大,则越重要。


TF:全称是Term Frequency,即词频(单词出现的频率),也就是一个单词在文档中出现的次数,次数越多越重要。


计算公式:一个单词的词频TF = 单词出现的次数 / 文档中的总单词数


IDF:全称是Inverse Document Frequency,即逆向文档词频,是指一个单词在文档中的区分度。


它认为一个单词出现在的文档数越少,这个单词对该文档就越重要,就越能通过这个单词把该文档和其他文档区分开。


计算公式:一个单词的逆向文档频率 IDF = log(文档总数 / 该单词出现的文档数 + 1)


为了避免分母为0(有些单词可能不在文档中出现),所以在分母上加1

image.png


IDF 是一个相对权重值,公式中log 的底数可以自定义,一般可取2,10,e 为底数。


假设有一篇文章,文章中共有2000 个词组,“好看”出现100 次。假设全网共有1 亿篇文章,其中包含“好看”的有200 万篇。现在我们要求“好看”的TF-IDF值。


TF(中国) = 100 / 2000 = 0.05
IDF(中国) = log(1亿/(200万+1)) = 1.7 # 这里的log 以10 为底
TF-IDF(中国) = 0.05 * 1.7 = 0.085


通过计算文档中单词的TF-IDF 值,我们就可以提取文档中的特征属性,就是把TF-IDF 值较高的单词,作为文档的特征属性。


sklearn中TfidfVectorizer

sklearn 库的 feature_extraction.text 模块中的 TfidfVectorizer 类,可以计算 TF-IDF 值。


参数介绍:


TfidfVectorizer(*, 
  input='content', 
  encoding='utf-8', 
  decode_error='strict', 
  strip_accents=None, 
  lowercase=True, 
  preprocessor=None, 
  tokenizer=None, 
  analyzer='word', 
  stop_words=None, 
  token_pattern='(?u)\b\w\w+\b', 
  ngram_range=(1, 1), 
  max_df=1.0, 
  min_df=1, 
  max_features=None, 
  vocabulary=None, 
  binary=False, 
  dtype=<class 'numpy.float64'>, 
  norm='l2', 
  use_idf=True, 
  smooth_idf=True, 
  sublinear_tf=False)


参数解释:


input:有三种取值:


filename

file

content:默认值为content。


analyzer:有三种取值,分别是:


word:默认值为word。

char

char_wb


stop_words:表示停用词,有三种取值:


english:会加载自带英文停用词。

None:没有停用词,默认为None。

List类型的对象:需要用户自行加载停用词。只有当参数 analyzer == ‘word’ 时才起作用。


token_pattern:


表示过滤规则,是一个正则表达式,不符合正则表达式的单词将会被过滤掉。 注意默认的 token_pattern 值为

r’(?u)\b\w\w+\b’,匹配两个以上的字符,如果是一个字符则匹配不上。只有参数 analyzer == ‘word’

时,正则才起作用。


max_df:


用于描述单词在文档中的最高出现率,取值范围为 [0.0~1.0]。 比如 max_df=0.6,表示一个单词在 60%

的文档中都出现过,那么认为它只携带了非常少的信息,因此就不作为分词统计。


mid_df:单词在文档中的最低出现率,一般不用设置。


常用的方法有


t.fit(raw_docs):用raw_docs 拟合模型。


t.transform(raw_docs):将 raw_docs 转成矩阵并返回,其中包含了每个单词在每个文档中的 TF-IDF 值。


t.fit_transform(raw_docs):可理解为先 fit 再 transform。


在上面三个方法中:


t 表示 TfidfVectorizer 对象。

raw_docs 参数是一个可遍历对象,其中的每个元素表示一个文档。


fit_transform 与 transform 的用法


一般在拟合转换数据时,先处理训练集数据,再处理测试集数据。 训练集数据会用于拟合模型,而测试集数据不会用于拟合模型。所以:

fit_transform 用于训练集数据。 transform 用于测试集数据,且 transform 必须在 fit_transform

之后。

如果测试集数据也用 fit_transform 方法,则会造成过拟合。


代码实例

#中文分词
import jieba
str1 = "今天天气很好,不如我们去走走吧!"
str2 = "如果每一次天气都下雨,那么我们的计划就要取消了!"
# 将文本放入一个列表
X = [str1,str2]   # 数据集
y = ['正能量','负能量']  # 目标数据
# 使用结巴将每一个文本样本进行分词,变成空格间隔的词
splited_X = []
for s in X:
    splited_X.append(" ".join(jieba.lcut(s)))
print(splited_X)
# 空格间隔的词的文本可以直接使用sklearn的向量化构造器进行向量化
tv = TfidfVectorizer()
splited_X_metrics = tv.fit_transform(splited_X)
print(tv.get_feature_names())  # 特征向量
print(splited_X_metrics.toarray())



image.png


这里还有很多的默认参数,我们也可以进行指定,这样就可以根据实际的实验场景进行测试了!


import jieba

# 读取数据,一般采取文件读取方式或者pandas读取文本列

word='个人简介:【私信必回】CSDN博客专家、CSDN签约作者、华为云享专家,腾讯云、阿里云、简书、InfoQ创作者。公众号:书剧可诗画,2020年度CSDN优秀创作者。左手诗情画意,右手代码人生,欢迎一起探讨技术的诗情画意!'


# 内置词库的选择,不分词的词语
jieba.add_word("博客专家")
jieba.suggest_freq("签约作者",True)
jieba.suggest_freq("华为云享专家",True)
jieba.suggest_freq("腾讯云",True)
jieba.suggest_freq("阿里云",True)
# 分词模式,精确模式;发现新词模式,使用百度飞浆模式
words = jieba.lcut(word,cut_all=False,HMM=True,use_paddle=True)
# 加载停用词过滤
with open('stopwords.txt', 'r+', encoding = 'utf-8')as fp:
    stopwords = fp.read().split('\n')  #将停用词词典的每一行停用词作为列表中的一个元素
word_list = []  #用于存储过滤停用词后的分词结果
for seg in words:
    if seg not in stopwords:
        word_list.append(seg)
print("*"*50+"分词结果"+"*"*50+'\n')
print(word_list)
tv = TfidfVectorizer(max_features=10)
print("*"*50+"构建词向量矩阵"+"*"*50+'\n')
print(tv.fit_transform(word_list).toarray())
print(tv.get_feature_names_out())  # 默认使用所有的词构建词袋
print(tv.vocabulary_)



image.png


CountVectorizer()

这个函数的作用是:生产 文档 - 词频 矩阵,如:

结构如下:

image.png


#只列出常用的参数
contv = CountVectorizer(encoding=u'utf-8', decode_error=u'strict',
lowercase=True,  stop_words=None,
token_pattern=u'(?u)\b\w\w+\b', ngram_range=(1, 1),
 analyzer=u'word', max_df=1.0, min_df=1,max_features=None,
 vocabulary=None, binary=False, dtype=<type 'numpy.int64'>)
相关文章
|
5天前
|
人工智能 自然语言处理 前端开发
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
Director 是一个构建视频智能体的 AI 框架,用户可以通过自然语言命令执行复杂的视频任务,如搜索、编辑、合成和生成视频内容。该框架基于 VideoDB 的“视频即数据”基础设施,集成了多个预构建的视频代理和 AI API,支持高度定制化,适用于开发者和创作者。
56 9
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
|
1月前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
46 2
|
1月前
|
机器学习/深度学习 数据采集 人工智能
揭秘AI:机器学习的魔法与代码
【10月更文挑战第33天】本文将带你走进AI的世界,了解机器学习的原理和应用。我们将通过Python代码示例,展示如何实现一个简单的线性回归模型。无论你是AI新手还是有经验的开发者,这篇文章都会给你带来新的启示。让我们一起探索AI的奥秘吧!
|
1月前
|
机器学习/深度学习 自然语言处理 PyTorch
从零开始构建nlp情感分析模型!
本教程介绍了如何使用PyTorch和Hugging Face的Transformers库构建一个情感分析模型。主要内容包括导入所需库、读取训练数据集、加载预训练的BERT模型和分词器、定义情感数据集类、划分训练集和验证集、创建数据加载器、设置训练参数、训练模型、评估模型性能以及定义和测试预测函数。通过这些步骤,可以实现一个简单而有效的情感分析模型。
127 2
|
2月前
|
数据采集 移动开发 数据可视化
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
这篇文章介绍了数据清洗、分析、可视化、模型搭建、训练和预测的全过程,包括缺失值处理、异常值处理、特征选择、数据归一化等关键步骤,并展示了模型融合技术。
97 1
模型预测笔记(一):数据清洗分析及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
|
2月前
|
自然语言处理 PyTorch 算法框架/工具
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
【10月更文挑战第1天】随着深度学习技术的进步,预训练模型已成为自然语言处理(NLP)领域的常见实践。这些模型通过大规模数据集训练获得通用语言表示,但需进一步微调以适应特定任务。本文通过简化流程和示例代码,介绍了如何选择预训练模型(如BERT),并利用Python库(如Transformers和PyTorch)进行微调。文章详细说明了数据准备、模型初始化、损失函数定义及训练循环等关键步骤,并提供了评估模型性能的方法。希望本文能帮助读者更好地理解和实现模型微调。
85 2
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
88 2
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
278 65
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
NLP的原理是什么?
【10月更文挑战第8天】NLP的原理是什么?
52 0
|
2月前
|
JSON 测试技术 API
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码
阿里云PAI-Stable Diffusion开源代码浅析之(二)我的png info怎么有乱码