TF VS TF-IDF 实验数据对比

主题词在文本中往往起到总结凝练的作用,代表一个文本的核心内容,在新闻、学术论文自动摘要以及网络检索等领域都有着广泛的应用。提取主题词比较常见的一种方法是基于词频统计的TF-IDF方法,通过对词语的权重进行打分排序,返回主题词,也就是后续向量空间模型(VSM)需要使用的特征词。存在的问题有:

  • 未考虑词语间语义关系、上下文语境
  • 可能将较高的权重赋予一部分稀有词

本文主要是通过对同一组样本数据进行分析,定性看一下基于TF得出的主题词和基于TF-IDF得出的主题词情况。

数据来源

采用搜狗实验室新闻样本数据的精简版本,每篇文本内容如下代码所示,正则匹配处理后得到166份文章内容。

1
2
3
4
5
6
<doc>
<url>http://news.sohu.com/20120612/n345428229.shtml</url>
<docno>c172394d49da2142-69713306c0bb3300</docno>
<contenttitle>公安机关销毁10余万非法枪支 跨国武器走私渐起</contenttitle>
<content>中广网唐山6月12日消息(记者汤一亮 庄胜春)据中国之声《新闻晚高峰》报道,今天(12日)上午,公安机关2012年缉枪制爆专项行动“统一销毁非法枪爆物品活动”在河北唐山正式启动,10万余只非法枪支、250余吨炸药在全国150个城市被统一销毁。黄明:现在我宣布,全国缉枪制爆统一销毁行动开始!随着公安部副部长黄明一声令下,大量仿制式枪以及猎枪、火药枪、气枪在河北唐山钢铁厂被投入炼钢炉。与此同时,在全国各省区市150个城市,破案追缴和群众主动上缴的10万余支非法枪支被集中销毁,在全国各指定场所,250余吨炸药被分别销毁。公安部治安局局长刘绍武介绍,这次销毁的非法枪支来源于三个方面。刘绍武:打击破案包括涉黑、涉恶的团伙犯罪、毒品犯罪,还有从境外非法走私的枪支爆炸物。在销毁现场,记者看到了被追缴和上缴的各式各样的枪支。刘绍武:也包括制式枪,有的是军用枪、仿制的制式抢,还有猎枪、私制的火药枪等等。按照我国的枪支管理法,这些都是严厉禁止个人非法持有的。中国是世界上持枪犯罪的犯罪率最低的国家之一。中美联手破获特大跨国走私武器弹药案近日,中美执法部门联手成功破获特大跨国走私武器弹药案,在中国抓获犯罪嫌疑人23名,缴获各类枪支93支、子弹5万余发及大量枪支配件。在美国抓获犯罪嫌疑人3名,缴获各类枪支12支。这是公安部与美国移民海关执法局通过联合调查方式侦破重大跨国案件的又一成功案例。2011年8月25日,上海浦东国际机场海关在对美国纽约发往浙江台州,申报品名为扩音器(音箱)的快件进行查验时,发现货物内藏有手枪9支,枪支配件9件,长枪部件7件。经检验,这些都是具有杀伤力的制式枪支及其配件。这引起了公安部和海关总署的高度重视。公安部刑侦局局长刘安成:因为是从海关进口的货物中检查出来夹带,说明来源地是境外,或是说国外,这应该是一起特大跨国走私武器弹药的案件。上海市公安局和上海海关缉私局成立联合专案组,迅速开展案件侦查。专案组于8月26日在浙江台州UPS取件处将犯罪嫌疑人王挺(男,32岁,台州市人)抓获。王挺交代,他通过一境外网站上认识了上家林志富,2009年11月以来,林志富长期居住美国,他通过互联网组建了一个走私、贩卖、私藏枪支弹药的群体,通过网络在国内寻找枪支弹药买家,并通过美国UPS联邦速递公司将枪支弹药从纽约快递给多名类似王挺的中间人,再通过中间人发送给国内买家。此案中,犯罪分子依托虚拟网络进行犯罪交易,隐蔽性强,涉案人员使用的身份、地址、联系方式都是虚构的,侦查难度很大。刘安成说,此案体现了是新型犯罪,特别是现代犯罪的新特点。刘安成:他不受距离的限制、经常是跨国跨境,甚至是跨一个、数个、甚至数十个国家。这种犯罪手法的改变和新型犯罪的特点,要求我们各国警方充分合作。作者:汤一亮 庄胜春</content>
</doc>

文本预处理

文本数据预处理一般都是分词,过滤停用词,然后构建特征向量。直接见代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def text_processing(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
dataset = f.read()

pattern = re.compile(r'<content>(.*?)</content>', re.S)
content_list = re.findall(pattern, dataset)
content_data = []
for item in content_list:
if len(item) > 1:
content_data.append(item)

clean_words = []
for item in content_data:
words = list(jieba.cut(item))
clean_words.append([word for word in words if word not in stopwords_set and not word.isdigit() and len(word) > 1])

corpus = []
for word in clean_words:
corpus.append(' '.join(word))

return corpus

构建特征向量

将经过文本预处理后的语料数据传入下面方法中,利用sklearn工具分别构建TF矩阵和TF-IDF矩阵,特别说明的是在整个过程中,未进行归一化操作。

1
2
3
4
5
6
7
8
9
10
11
def 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
22
corpus = 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---