主题词在文本中往往起到总结凝练的作用,代表一个文本的核心内容,在新闻、学术论文自动摘要以及网络检索等领域都有着广泛的应用。提取主题词比较常见的一种方法是基于词频统计的TF-IDF方法,通过对词语的权重进行打分排序,返回主题词,也就是后续向量空间模型(VSM)需要使用的特征词。存在的问题有:
- 未考虑词语间语义关系、上下文语境
- 可能将较高的权重赋予一部分稀有词
本文主要是通过对同一组样本数据进行分析,定性看一下基于TF得出的主题词和基于TF-IDF得出的主题词情况。
数据来源
采用搜狗实验室新闻样本数据的精简版本,每篇文本内容如下代码所示,正则匹配处理后得到166份文章内容。
1 | <doc> |
文本预处理
文本数据预处理一般都是分词,过滤停用词,然后构建特征向量。直接见代码。
1 | def text_processing(file_path): |
构建特征向量
将经过文本预处理后的语料数据传入下面方法中,利用sklearn工具分别构建TF矩阵和TF-IDF矩阵,特别说明的是在整个过程中,未进行归一化操作。1
2
3
4
5
6
7
8
9
10
11def make_count_vectorizer(corpus):
vectorizer = CountVectorizer(stop_words=None)
# 计算词频,未进行归一化
tf = vectorizer.fit_transform(corpus)
feature_names = vectorizer.get_feature_names()
return tf,feature_names
def make_tfidf(tf):
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(tf)
return tfidf
保存查看结果
分别存储TF矩阵和TF-IDF矩阵中每一行TOP10的词语(即每一篇文章的前10个特征词),并记录对应词频或者权重1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22corpus = text_processing(origin_data_path)
tf, feature_names = make_count_vectorizer(corpus)
tfidf = make_tfidf(tf)
rs = tf.toarray()
rows, cols = np.shape(rs)
tfidf_rs = tfidf.toarray()
with open('test.txt', 'w', encoding='utf-8') as f:
for row in range(rows):
f.write('\n---'+str(row)+"---\n")
index_list_tf = rs[row].argsort()[:-11:-1]
index_list_tfidf = tfidf_rs[row].argsort()[:-11:-1]
f.write(' tf:')
for index in index_list_tf:
f.write(feature_names[index]+str(rs[row][index]))
f.write("\ntfidf:")
for index in index_list_tfidf:
f.write(feature_names[index]+str(tfidf_rs[row][index])[:5])
分析结果
取前10篇文章,结合文本内容和算法计算得出的主题词。可以看出两种方式都较好的提取出文章内容的关键词,但通过对主题词降序查看可以大致看出TF-IDF要做的更好。TF-IDF会降低一些副词或介词的权重,比如“通过”、“表示”、“之后”等等叫常用词,同时,也挖掘出一些更具代表性的词,如“非你莫属”、“丹麦”、“唐山”等。耳听为虚,眼见为实,程序跑一跑才知道哪个会更好!1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28---0---
tf:犯罪11枪支11销毁7通过6非法6走私5跨国5公安部5全国4配件3
tfidf:枪支0.372犯罪0.328销毁0.271走私0.179公安部0.179跨国0.179非法0.173唐山0.116绍武0.116刘安0.116
---1---
tf:张绍10网友8了解5问题5道歉5学生4节目组3时候3没有3群体3
tfidf:张绍0.529网友0.305道歉0.219学生0.184了解0.169非你莫属0.158节目组0.158问题0.154群体0.131硬挺0.105
---2---
tf:麦客5小麦5收割机4夫妻3麦收3收割3郯城县3驾驶3联合3郯城2
tfidf:小麦0.346麦客0.346收割机0.277郯城县0.208收割0.208麦收0.208夫妻0.192驾驶0.181联合0.142辛勤0.138
---3---
tf:比赛8荷兰7葡萄牙6葡萄牙队6德国5球队5之后5输球5提前4今天4
tfidf:比赛0.344荷兰0.301葡萄牙0.258葡萄牙队0.258输球0.215球队0.215德国0.215丹麦0.172提前0.143之后0.141
---4---
tf:伯格7扎克7妻子4报道3夫妇3中国3一位2创始人2警察2脸谱2
tfidf:扎克0.465伯格0.465妻子0.212夫妇0.184脸谱0.133创始人0.133英镑0.133台阶0.133街边0.133镜头0.123
---5---
tf:文化39投资13胶南市12万元10公共8社区7建设7演出6全市6设施6
tfidf:文化0.679胶南市0.271公共0.181投资0.169演出0.135万元0.132社区0.126全市0.125设施0.125分馆0.113
---6---
tf:金正恩3代表3少年3朝鲜2准备1牛肉1第一书记1日电1中国1坚定1
tfidf:金正恩0.427少年0.395代表0.328朝鲜0.284朝鲜劳动党0.142第一书记0.142坚定0.142送来0.142跟随0.142牛肉0.142
---7---
tf:企业10审计8问题6表示5中央5管理5审计署5整改4相关4国资委4
tfidf:审计0.420企业0.326审计署0.283国资委0.227中央0.218整改0.210问题0.199管理0.160完善0.123表示0.116
---8---
tf:交易7证监会5股票4异常4上市公司4信息3资产重组3重大3本次2核查2
tfidf:交易0.411证监会0.347上市公司0.309异常0.309股票0.278资产重组0.232重大0.172内幕0.154重组0.145核查0.145
---9---