自然语言处理历史

阶段

时间

发展意义

早期阶段

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
  • 可能会报错,请参照文章【传送门】
  • 可能需要借助工具

模型结果展示

lda关键词权重导出 关键词id_lda关键词权重导出

输出的结果我们发现:

  • 一条数据有两个值,第一个是词的ID,第二个是TF-IDF值

上述的语料是英文,处理中文有专用的分词工具jieba

#使用jieba分词工具处理中文

import jieba

seg_list = jieba.cut("我就不信你能把我切得很好?不存在的,小老弟",cut_all=False)

print("Default Mode: " + " ".join(seg_list)) # 精确模式