自然语言处理历史
阶段 | 时间 | 发展意义 |
早期阶段 | 1956 年以前 | 香农曾提出过概率模型来描述语言,乔姆斯基提出了基于规则的上下文无关文法。阶段还没有太明确的产出,只有一些简单的拼凑 |
快速发展 | 1957-1970 | 两大派别分别从概率模型和规则模型分别进行了深入的研究,使用规则构建机器翻译已经小有成效 |
瓶颈期 | 1971-1993 | 研究停滞,产出的隐马尔科夫模型(HMM) |
再次爆发 | 1994 年之后 | 运力设备提升,互联网崛起,飞速发展 |
TF-IDF
TF-IDF(Term frequency–inverse document frequency),中文翻译就是词频 - 逆文档频率,是一种用来计算关键词的传统方法。 一本储存文本都很长,获取有价值的信息就需要提取文章的关键字,相当于数据的降维,提取的关键词再用与文本的分类。 TF(Term Frequency):TF 的意思就是词频,是指某个词(Term)在一篇新闻中出现的次数。
- TF标准化=该词词频/文章的总词数
但是想文章里面“他的”、“即是”等等无关词也会在文章中反复出现,这时候需要IDF IDF(Inverse Document Frequency):IDF 称为逆文档频率
- IDF=Log(新闻总数量/包含某一个词的新闻数量+1)
如果一个词约普通,那么IDF值越接近与0 但是对于某一些生僻的词,比如“埿好”,虽然他的IDF值会非常大, 但是似乎这个词并没有什么意义
于是乎 就有了TF-IDF,即是TF*IDF性质:TF-IDF 与一个词在新闻中出现的次数成正比,与该词在整个语料上出现的次数成反比。
TF-IDF优缺点
优点:
算法简单、好理解、运算速度快。
缺点:
短文本无效,因为短文本的很多词出现一次的概率太大,算法很难提取到有效的关键词 很难处理一词多义,因为中文博大精深呀!
案例实战
import gensim.downloader as api
from gensim.corpora import Dictionary
#加载数据 注意第一次加载需要下载 时间有点长
dataset = api.load("text8")
dct = Dictionary(dataset)
new_corpus = [dct.doc2bow(line) for line in dataset]
#加载模型库
from gensim import models
#训练模型
tfidf = models.TfidfModel(new_corpus)
#保存模型
tfidf.save("tfidf.model")
# 载入模型
tfidf = models.TfidfModel.load("tfidf.model")
# 使用这个训练好的模型得到单词的tfidf值
tfidf_vec = []
for i in range(len(new_corpus)):
string_tfidf = tfidf[new_corpus[i]]
tfidf_vec.append(string_tfidf)
# 输出 词语id与词语tfidf值
print(tfidf_vec)
友情提示:
- 处理dataset = api.load("text8")可能需要调bug
- 可能会报错,请参照文章【传送门】
- 可能需要借助工具
模型结果展示
输出的结果我们发现:
- 一条数据有两个值,第一个是词的ID,第二个是TF-IDF值
上述的语料是英文,处理中文有专用的分词工具jieba
#使用jieba分词工具处理中文
import jieba
seg_list = jieba.cut("我就不信你能把我切得很好?不存在的,小老弟",cut_all=False)
print("Default Mode: " + " ".join(seg_list)) # 精确模式