赞
踩
从分词、词表优化、词向量、词频、解码以及构建一个完整的文本分类模型讲解NLP基础面试题。本篇主要讲词频部分。
最近面试中出现的编程题除了leetcode中的题目,出现了越来越多考验NLP基础,比如统计单词重要程度;简单的文本分类这类基础编程题,因此文中提到的NLP基础知识和计算公式最好要很熟悉,不准备很容易掉坑里。
本系列将从分词、词表优化、词向量、词频、解码的理论和实践代码讲起,最终会将所有知识化零为整搭建一个完整的文本分类模型。
前面两期讲了分词、词表优化、词向量部分部分,本篇主要讲词频部分。下面是一个快捷目录。
一、分词
1. 讲讲你知道的分词算法,前后向最大匹配、维特比算法(viterbi)、HMM等
2. 用代码实现文本的分词函数
二、词表优化
1. 训练时词表大小过大,输出层过大,有什么优化方法
三、词向量
1. 词向量有哪些embedding方式
2. 详细讲讲glove、word2vec
3. 详细讲讲目前的动态embedding
4. 动态embedding中,将得到的representation运用到下游任务有哪些方式,特点是什么
四、词频
1. 讲讲TF-IDF
2. 实现TF-IDF算法
五、解码
1. 讲讲Beam search 、Random sample策略
2. 手撕代码
六、文本分类模型构建
1. 停用词设计
2. 词的权重计算(TF-IDF)
3. 考虑否定词对分类效果的影响
4. 分类方法
5. 损失函数/概率设计
6. 加分项:手动分词、temperature等
讲讲TF-IDF
1. 前言
在具体讲之前先讲一下了解这个算法有什么用。
假设有一道编程题目,描述为
下面有N篇文档,文档未进行分类标注。已知有积极、消极、中性三种分类,且具体关键词库举例如下。``请对每篇文档进行分类。`` ``"积极":["美好","伟大", "赞扬",...]``"中性":["念念不忘", ...]``"消极":["难受", "孤独"...]
看完上面的题目,我们首先要考虑提取每篇文档表达的核心思想,核心思想主要通过文章中的关键词来表现;
那么如何自动提取每个文档中的关键词呢,我们就需要用TF-TDF算法了。
2. TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)介绍
TF-IDF本质是一种统计方法,用来评估 词/字 对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
主要思想:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
1)TF(Term Frequency) 词频
表示词条(关键字)在文本中出现的频率。
这个数字通常会被归一化(一般是词频除以文章总词数,也可以是这篇文章中出现最多的词的出现次数), 以防止它偏向长的文件。
具体公式如下
也可以是
2)IDF(Inverse Document Frequency) 逆向文件频率
需要基于一个语料库,语料库中包含多个文档。
IDF是针对某一特定词语进行计算,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
如果包含该特定词语的文档越少, IDF越大,则说明词条具有很好的类别区分能力。
具体公式如下
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。
3)计算TF-IDF
TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。
所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。
4)举例
假设目前有一张Google网页文档《中国的蜜蜂养殖》,语料库就是所有谷歌中文网页,我们想要选择一个这篇文中的关键词。
假定《中国的蜜蜂养殖》这篇文档文长度为1000个词,“中国”、“蜜蜂”、“养殖"各出现20次,则这三个词的"词频”(TF)都为0.02。
搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数。
包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张
那么可以计算出它们的逆文档频率(IDF)和TF-IDF如下:
从上表可见,"蜜蜂"的TF-IDF值最高,"养殖"其次,"中国"最低。所以,如果只选择一个词,"蜜蜂"就是这篇文章的关键词。
大家还可以尝试计算一下"的"字的TF-IDF,极其接近0。
4)TF-IDF的用法
文档关键词提取
文档信息检索
设定检索关键词,如何从文档库中选出最符合检索要求的文档?
信息检索时,对于每个文档,都可以分别计算一组搜索词(“中国”、“蜜蜂”、“养殖”)的TF-IDF,将它们相加,就可以得到整个文档的TF-IDF。这个值最高的文档就是与搜索词最相关的文档。
5)TF-IDF的优缺点
简单快速,结果比较符合实际情况
(a)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)
(b)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。
(c)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。
(d)单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多;比如对于文档中出现次数较少的重要人名、地名信息提取效果不佳。
实现TF-TDF算法
下面我们不用任何库,用python来手动实现一下TF-TDF算法。
1. 建立语料库
# 建立一个语料库``corpus = [` `"what is the weather like today",`` "what is for dinner tonight", `` "this is a question worth pondering", `` "it is a beautiful day today"``]``# 进行分词``words = []``for i in corpus:` `words.append(i.split(" "))``print(words)
2. 去掉停用词
# 如果有自定义的停用词典,我们可以用下列方法来分词并去掉停用词``f = ["is", "the"]``for i in corpus:` `all_words = i.split()` `new_words = []` `for j in all_words:` `if j not in f:` `new_words.append(j)` `words.append(new_words)``print(words)
3. 统计词频
# 进行词频统计``def Counter(word_list):` `wordcount = []`` for i in word_list: `` count = {} `` for j in i: `` if not count.get(j): `` count.update({j: 1}) `` elif count.get(j): `` count[j] += 1 `` wordcount.append(count) `` return wordcount` `wordcount = Counter(words)
4. 计算TF-IDF的函数定义
# 计算TF(word代表被计算的单词,word_list是被计算单词所在文档分词后的字典)``def tf(word, word_list):` `return word_list.get(word) / sum(word_list.values())` `# 统计含有该单词的句子数``def count_sentence(word, wordcount):` `return sum(1 for i in wordcount if i.get(word))` `# 计算IDF``def idf(word, wordcount):` `return math.log(len(wordcount) / (count_sentence(word, wordcount) + 1))` `# 计算TF-IDF``def tfidf(word, word_list, wordcount):` `return tf(word, word_list) * idf(word, wordcount)
5. 根据语料库,计算出每个文档(在本例中是单个短句)的TF-IDF
p = 1``for i in wordcount:` `print("part:{}".format(p))`` p = p+1 `` for j, k in i.items(): `` print("word: {} ---- TF-IDF:{}".format(j, tfidf(j, i, wordcount)))``
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
保证100%免费
】Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。