社区编辑申请
注册/登录
关于自然语言处理之One Hot模型
人工智能 自然语言处理
顾名思义,单热表示从一个零向量开始,如果单词出现在句子或文档中,则将向量中的相应条目设置为 1。

本文转载自微信公众号「python与大数据分析」,作者 一只小小鸟鸟 。转载本文请联系python与大数据分析公众号。

最近工作实在有点忙,前阵子关于梯度和导数的事情把人折腾的够呛,数学学不好,搞机器学习和神经网络真是头疼;想转到应用层面轻松一下,想到了自然语言处理,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] 。

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

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

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

 

责任编辑:武晓燕 来源: python与大数据分析
相关推荐

2022-04-22 09:00:00

自然语言处理HMMCRF

2022-06-28 14:01:42

MITOpenAI预训练模型

2022-05-25 07:11:13

2022-06-27 15:25:08

架构模型治理

2022-06-22 08:02:11

2022-06-24 11:14:00

美团开源

2022-06-16 09:22:28

图数据库图数据数据库

2022-06-07 14:31:09

K8S网络模型容器网络

2022-06-15 16:16:21

分布式数据库鸿蒙

2022-05-17 09:14:50

聚类算法python

2022-06-20 06:27:58

Meta人工智能AI模型

2022-06-16 14:59:34

端到端语音翻译系统对话翻译翻译模型

2022-06-21 21:47:13

数据系统

2022-06-07 14:47:43

飞书智能问答模型

2022-06-21 14:22:08

云计算混合云人工智能

2022-05-24 07:51:05

测试模型测试单元测试

2022-06-06 14:29:20

图像模型任务

2022-04-28 16:14:05

区块链加密货币数据

2022-05-24 14:26:11

云原生数据库云架构

2022-05-06 16:31:27

人工智能自然语言生物特征识别

同话题下的热门内容

YOLOv6:又快又准的目标检测框架开源啦LeCun预言AGI:大模型和强化学习都是斜道!我的「世界模型」才是新路聊聊七个常见的智能汽车技术李飞飞划重点的「具身智能」,走到哪一步了?惊呆了!训练7万小时后,OpenAI的模型竟然学会在「我的世界」里刨木头华为发布两大昇腾计划 推动AI人才发展和科研创新T 前线 | 专访作业帮首席AI架构师王岩:AI的普惠性在于思路创新首个大众可用PyTorch版AlphaFold2复现,哥大开源,star量破千

编辑推荐

转转公司架构算法部孙玄:AI下的微服务架构Facebook开源相似性搜索类库Faiss,超越已知最快算法8.5倍运维:对不起,这锅,我们不背快消品图像识别丨无人店背后的商品识别技术最全面的百度NLP自然语言处理技术解析
我收藏的内容
点赞
收藏

51CTO技术栈公众号