NLP 基础(上):详解自然语言处理原理与常用算法
一、课程背景
从这节课开始,我们正式进入自然语言处理(NLP)的学习,这是继计算机视觉之后的第二个实战方向。NLP 的应用深入到了互联网业务的方方面面,掌握 NLP 相关算法将使我们的竞争力大大增强。[pdf_21]
二、NLP 应用场景
1. 语言学方向(研究类)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. 应用类方向(处理与应用)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. 搜索引擎实例
以搜索"亚洲的动 wu"为例,搜索引擎后台需要完成:[pdf_21]
|
|
|
|---|---|
| query 解析 |
|
| 实体搜索与过滤 |
|
| 扩展结果推荐 |
|
| 构建准备阶段 |
|
三、NLP 三大经典基础问题
要让程序理解文本内容,需要解决三个非常基础和重要的内容:[pdf_21]
-
分词 -
文本表示 -
关键词提取
四、分词
为什么需要分词
中文与英文最大不同:英文单词间有空格隔断,中文单词之间除了标点符号没有别的隔断,因此需要分词程序来帮助理解文本。[pdf_21]
常用分词工具
|
|
|
|---|---|
|
|
jieba
|
|
|
|
jieba 分词示例
import jieba
text = "极客时间棒呆啦"
# jieba.cut 得到的是 generator 形式的结果
seg = jieba.cut(text)
print(' '.join(seg))
# 输出:极客 时间 棒呆 啦
jieba 词性标注示例
import jieba.posseg as posseg
text = "一天不看极客时间我就浑身难受"
seg = posseg.cut(text)
print([se for se in seg])
# 输出:[pair('一天', 'm'), pair('不', 'd'), pair('看', 'v'),
# pair('极客', 'n'), pair('时间', 'n'), pair('我', 'r'),
# pair('就', 'd'), pair('浑身', 'n'), pair('难受', 'a')]
★词性标注中的英文缩写:m(数词)、d(副词)、v(动词)、n(名词)、r(代词)、a(形容词)
五、文本表示方法
1. One-hot(独热)表示法
原理:假设共有 N 个单词,每个单词用一个 N 位向量表示,将该单词对应序号的位置置 1,其余置 0。[pdf_21]
示例:词典大小为 10000,"极客"的 id 为 666,则向量为第 666 位为 1,其余为 0。
缺点:中文 UTF-8 编码下有两万多个字符,词语数量更大,数据量非常庞大。
2. 文档级压缩表示
原理:用一个向量表示文章中所有单词。建立一个 N 维向量,将文章中出现过的所有单词对应位置置 1,其余为 0。[pdf_21]
优点:相比逐词表示,数据体积大幅减少。
3. Count-based 表示方法
原理:对每个出现的单词的序号 id 及出现次数进行统计,形式为 {index1: count1, index2: count2, ...}。[pdf_21]
示例:"极客时间"只需两个 k-v 对表示:{3:1, 665:1}。
|
|
|
|---|---|
|
|
不能表述单词的语序信息 |
|
|
|
4. Word Embedding(词嵌入)
-
深度学习的应用推动了 Word Embedding 的发展,现在基本上都会采用该方法进行文本表示 -
但不意味着传统文本表示方法过时,在小规模、轻量级文本处理场景中仍作用巨大 -
详细内容通过后续 BERT 实战课程展开讲解[pdf_21]
六、关键词提取
概述
关键词是能够表达文本中心内容的词语,在检索系统、推荐系统等应用中占有极重要地位。[pdf_21]
三种无监督方法:
|
|
|
|
|---|---|---|
|
|
TF-IDF |
|
|
|
TextRank |
|
|
|
LDA |
|
1. TF-IDF(基于统计特征)
核心思想:一个单词在文件中出现次数越多,重要性越高;但在语料库中出现的频率越高,重要性反而越小。[pdf_21]
计算公式:
|
|
|
|
|---|---|---|
| TF(词频) |
|
|
| IDF(逆向文件频率) |
|
|
| TF-IDF |
|
|
使用工具:NLTK(Natural Language Toolkit),pip install nltk 安装
TF-IDF 的缺点(来自课程留言区讨论):[pdf_21]
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
2. TextRank(基于词图模型)
原理:构建文本的图结构表示语言的词语网络,对语言进行网络图分析,在图上寻找具有重要作用的词或短语。[pdf_21]
与 PageRank 的关系:TextRank 脱胎于 PageRank。
|
|
|
|---|---|
|
|
|
|
|
|
jieba 集成 TextRank:
jieba.analyse.textrank(sentence, topK=20, withWeight=False,
allowPOS=('ns', 'n', 'vn', 'v'))
|
|
|
|---|---|
sentence |
|
topK |
|
withWeight |
|
allowPOS |
|
3. LDA(基于主题模型)
LDA(Latent Dirichlet Allocation):文档主题生成模型,是最典型的基于主题模型的算法。它会"发现"文档集合中出现的抽象的"主题",用于挖掘文本中隐藏的语义结构。[pdf_21]
使用 gensim 实现 LDA:
from gensim import corpora, models
import jieba.posseg as jp
import jieba
input_content = [line.strip() for line in open('input.txt', 'r')]
# 第一步:分词
words_list = []
for text in input_content:
words = [w.word for w in jp.cut(text)]
words_list.append(words)
# 第二步:构建文本统计信息,为每个单词分配序列id
dictionary = corpora.Dictionary(words_list)
# 第三步:构建语料,将dictionary转化为词袋(Bag of Words)
corpus = [dictionary.doc2bow(words) for words in words_list]
# 第四步:训练 LDA 模型
lda_model = models.ldamodel.LdaModel(
corpus=corpus,
num_topics=8,
id2word=dictionary,
passes=10
)
LDA 参数说明:
|
|
|
|---|---|
num_topics |
|
id2word |
|
passes |
|
七、每课一练
问题:TF-IDF 有哪些缺点?建议结合其计算过程做梳理。[pdf_21]
解答要点:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
八、核心要点总结
|
|
|
|---|---|
| NLP 三大基础问题 |
|
| 分词工具 |
|
| 文本表示方法 |
|
| Count-based 缺点 |
|
| 关键词提取方法 |
|
| TF-IDF 核心 |
|
| TextRank 核心 |
|
| LDA 核心 |
|
九、小结
-
NLP 三大基础问题:分词、文本表示、关键词提取,已有大量集成工具可供直接使用。 -
分词:中文与英文结构不同,需要分词程序帮助理解,推荐使用 jieba。 -
文本表示:从 One-hot 到 Word Embedding,深度学习推动了词嵌入的发展,但传统方法在小规模场景中仍作用巨大。 -
关键词提取:三种方法各有侧重——TF-IDF 基于统计、TextRank 基于图网络、LDA 基于主题模型。 -
核心观点:有了工具并不意味着不需要理解其内部原理,学习要知其然,更需知其所以然,这样在实际工作中遇到问题时才能游刃有余地解决。[pdf_21]

