最近工作实在有点忙,前阵子关于梯度和导数的事情把人折腾的够呛,数学学不好,搞机器学习和神经网络真是头疼;想转到应用层面轻松一下,想到了自然语言处理,one hot模型是基础也是入门,看起来很简单的一个列表转矩阵、词典的功能,想着手工实现一下,结果看了一下CountVectorizer,发现不是那么回事儿,还是放弃了。

顾名思义,单热表示从一个零向量开始,如果单词出现在句子或文档中,则将向量中的相应条目设置为 1。

对句子进行标记,忽略标点符号,并将所有的单词都用小写字母表示,就会得到一个大小为 8 的词汇表: {time, fruit, flies, like, a, an, arrow, banana} 。所以,我们可以用一个八维的单热向量来表示每个单词。在本书中,我们使用 1[w] 表示标记/单词 w 的单热表示。

对于短语、句子或文档,压缩的单热表示仅仅是其组成词的逻辑或的单热表示。短语 like a banana 的单热表示将是一个 3×8 矩阵,其中的列是 8 维的单热向量。通常还会看到“折叠”或二进制编码,其中文本/短语由词汇表长度的向量表示,用 0 和 1 表示单词的缺失或存在。like a banana 的二进制编码是: [0,0,0,1,1,0,0,1] 。

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import seaborn as sns
import matplotlib.pyplot as plt
import jieba
import jieba.analyse# 单热表示从一个零向量开始,如果单词出现在句子或文档中,则将向量中的相应条目设置为 1。
# 英文的处理和展示
corpus = ['Time flies flies like an arrow.', 'Fruit flies like a banana.']
one_hot_vectorizer = CountVectorizer(binary=True)
one_hot = one_hot_vectorizer.fit_transform(corpus).toarray()
sns.heatmap(one_hot, annot=True, cbar=False, yticklabels=['Sentence 1', 'Sentence 2'])
plt.show()

# 中文的处理和展示
# 获取停用词列表
def get_stopwords_list(stopwordfile):stopwords = [line.strip() for line in open(stopwordfile, encoding='UTF-8').readlines()]return stopwords# 移除停用词
def movestopwords(sentence):stopwords = get_stopwords_list('stopwords.txt')  # 这里加载停用词的路径santi_words = [x for x in sentence if len(x) > 1 and x not in stopwords]return santi_words# 语料
corpus = ["小明硕士毕业于中国科学院计算所,后在日本京都大学深造。","小王本科在清华大学,后在南京计算所工作和深造,后在日本早稻田大学深造","小李本科在清华大学,硕士毕业于中国科学院计算所,博士在南京大学"]
newcorpus = []
for str in corpus:orgwordlist = jieba.lcut(str)  # jieba分词wordlist = movestopwords(orgwordlist)  # 移除停用词newword = " ".join(wordlist)  # 按照语料库要求进行空格分隔newcorpus.append(newword)  # 按照语料库要求转换成列表
# newcorpus
# ['小明 硕士 毕业 中国科学院 计算所 日本京都大学 深造',
# '小王 本科 清华大学 南京 计算所 工作 深造 日本早稻田大学 深造',
# '小李 本科 清华大学 硕士 毕业 中国科学院 计算所 博士 南京大学']
one_hot_vectorizer = CountVectorizer(binary=True)  # 创建词袋数据结构
one_hot = one_hot_vectorizer.fit_transform(newcorpus).toarray()  # 转换语料,并矩阵化
# 下面为热词的输出结果
# one_hot_vectorizer.vocabulary_
# {'小明': 4, '硕士': 14, '毕业': 11, '中国科学院': 0, '计算所': 15, '日本京都大学': 8, '深造': 12, '小王': 6, '本科': 10, '清华大学': 13, '南京': 1, '工作': 7, '日本早稻田大学': 9, '小李': 5, '博士': 3, '南京大学': 2}
# one_hot_vectorizer.get_feature_names()
# ['中国科学院', '南京', '南京大学', '博士', '小明', '小李', '小王', '工作', '日本京都大学', '日本早稻田大学', '本科', '毕业', '深造', '清华大学', '硕士', '计算所']
# one_hot
# [[1 0 0 0 1 0 0 0 1 0 0 1 1 0 1 1]
#  [0 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1]
#  [1 0 1 1 0 1 0 0 0 0 1 1 0 1 1 1]]
sns.set_style({'font.sans-serif': ['SimHei', 'Arial']})
sns.heatmap(one_hot, annot=True, cbar=False, xticklabels=one_hot_vectorizer.get_feature_names(),yticklabels=['语句1', '语句2', '语句3'])
plt.show()

IDF 表示惩罚常见的符号,并奖励向量表示中的罕见符号。符号 w 的 IDF(w) 对语料库的定义为其中 n[w] 是包含单词 w 的文档数量, N 是文档总数。TF-IDF 分数就是 TF(w) * IDF(w) 的乘积。首先,请注意在所有文档(例如, n[w] = N ), IDF(w) 为 0, TF-IDF 得分为 0,完全惩罚了这一项。其次,如果一个术语很少出现(可能只出现在一个文档中),那么 IDF 就是 log n 的最大值

tfidf_vectorizer = TfidfVectorizer()  # 创建词袋数据结构
tfidf = tfidf_vectorizer.fit_transform(newcorpus).toarray()  # 转换语料,并矩阵化
# 下面为热词的输出结果
# tfidf_vectorizer.vocabulary_
# '小明': 4, '硕士': 14, '毕业': 11, '中国科学院': 0, '计算所': 15, '日本京都大学': 8, '深造': 12, '小王': 6, '本科': 10, '清华大学': 13, '南京': 1, '工作': 7, '日本早稻田大学': 9, '小李': 5, '博士': 3, '南京大学': 2}
# tfidf_vectorizer.get_feature_names()
# ['中国科学院', '南京', '南京大学', '博士', '小明', '小李', '小王', '工作', '日本京都大学', '日本早稻田大学', '本科', '毕业', '深造', '清华大学', '硕士', '计算所']
# tfidf
# [[0.35221512 0.         0.         0.         0.46312056 0.  0.         0.         0.46312056 0.         0.        0.35221512  0.35221512 0.         0.35221512 0.27352646]
#  [0.         0.35761701 0.         0.         0.         0.  0.35761701 0.35761701 0.         0.35761701 0.27197695 0.  0.54395391 0.27197695 0.         0.21121437]
#  [0.30443385 0.         0.40029393 0.40029393 0.         0.40029393  0.         0.         0.         0.         0.30443385 0.30443385  0.         0.30443385 0.30443385 0.23642005]]
sns.heatmap(tfidf, annot=True, cbar=False, xticklabels=tfidf_vectorizer.get_feature_names(),yticklabels=['语句1', '语句2', '语句3'], vmin=0, vmax=1, cmap="YlGnBu")
plt.show()

关于自然语言处理之one hot模型相关推荐

  1. 干货分享 | 自然语言处理及词向量模型介绍(附PPT)

    云脑科技机器学习训练营第二期,对自然语言处理及词向量模型进行了详细介绍,量子位作为合作媒体为大家带来本期干货分享~ 本期讲师简介 樊向军 云脑科技核心算法工程师,清华大学学士,日本东京大学与美国华盛顿 ...

  2. 「PyTorch自然语言处理系列」7. 自然语言处理的进阶序列模型

    来源 |  Natural Language Processing with PyTorch 作者 | Rao,McMahan 译者 | Liangchu 校对 | gongyouliu 编辑 | a ...

  3. 【自然语言处理】【大模型】BLOOM:一个176B参数且可开放获取的多语言模型

    BLOOM:一个176B参数且可开放获取的多语言模型 <BLOOM: A 176B-Parameter Open-Access Multilingual Language Model> 论 ...

  4. 【自然语言处理】【大模型】PaLM:基于Pathways的大语言模型

    PaLM:基于Pathways的大语言模型 <PaLM: Scaling Language Modeling with Pathways> 论文地址:https://arxiv.org/p ...

  5. 【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型

    Chinchilla:训练计算利用率最优的大语言模型 <Training Compute-Optimal Large Language Models> 论文地址:https://arxiv ...

  6. 【自然语言处理】【大模型】DeepMind的大模型Gopher

    DeepMind的大模型Gopher <Scaling Language Models: Methods, Analysis & Insights from Training Gophe ...

  7. NLP自然语言处理系列——LDA主题词模型探析

    NLP自然语言处理系列--LDA主题词模型探析 时间 2015-06-17 22:39:57  十一城elevencitys.com 原文  http://elevencitys.com/2015/0 ...

  8. 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍

    用于大型Transformer的8-bit矩阵乘法介绍 原文地址:A Gentle Introduction to 8-bit Matrix Multiplication for transforme ...

  9. 自然语言处理入门——使用RNN模型构建人名分类器

    自然语言处理入门 使用RNN模型构建人名分类器 以一个人名为输入,使用模型帮助判断最有可能是来自哪一个国家的人名,在某些国际化公司的业务中具有重要意义,例如在用户注册过程中,会根据用户填写的名字直接分 ...

最新文章

  1. 上传漏洞新姿势(限Linux)
  2. Py之xlutils:xlutils的简介、安装、使用方法之详细攻略
  3. jQuery图片上传前先在本地预览(不经过后端处理)
  4. SAP成本会计分录大全
  5. centos一键清理磁盘空间_docker越来越大,心慌,清理一波吧
  6. 为特使建立控制平面的指南-识别组件
  7. ubuntu1404_server搭建lamp
  8. border:0 none,border:none;,border:0;三者之间的区别
  9. 【吴恩达机器学习】学习笔记——1.5无监督学习
  10. sdk版本过低怎么办_区块链中的“块”是什么?区块链网络拥堵怎么办?-Gemini双子新约...
  11. IOS开发之网络编程--文件压缩和解压缩
  12. JavaWeb——AOP
  13. UVA12416 Excessive Space Remover【对数+字符流】
  14. 大学生对于繁体字的态度与认知情况调查
  15. noip2018秃页记
  16. SystemError: Negative size passed to PyUnicode_New
  17. kinect相机的安装环境搭建以及测试
  18. python爬取英雄联盟所有皮肤价格表_用python网络爬虫爬取英雄联盟英雄图片
  19. 炫酷canvas网页背景动画效果
  20. 从kernel源码进阶C语言

热门文章

  1. 综述:当医学影像遇上深度学习
  2. lbs多城市切换php源码,多省份多城市多区县切换 专业版(dicky_multicityswitch) dz插件分享,可以随意切换到其它地区分站功能...
  3. java趣味编程心形_求源代码!(迪卡尔心形图案)
  4. 对话祁隆《借我星光》作词人温暖:已获知和合国际收购信息
  5. 计算机用老毛桃u盘备份系统,老毛桃一键还原,教您电脑如何使用老毛桃一键还原...
  6. 组装计算机的游戏,如何组装游戏电脑
  7. GLES2.0中文API-glFramebufferTexture2D
  8. greasemonkey入门
  9. python root什么意思_root是什么意思?root后会有什么后果?
  10. October——I Will Talk