前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >40 行代码搞定主题词提取

40 行代码搞定主题词提取

作者头像
用户1332428
发布2018-07-30 15:02:56
3840
发布2018-07-30 15:02:56
举报

正文共1346个字,预计阅读时间8分钟。

大家都知道,做中文搜索?,得先搞定中文分词。突然意识到,以前从没想过「为什么分词能够提高搜索的精度?」。正确的问法应该是「分词为什么能够改善搜索的排序结果?」,或者「将小粒度的单元聚合成为稍大一点粒度的单元后,为什么居然能够改善搜索的质量?」。

这还有什么好问的,更高级别的抽象当然更能代表文档了。对对对,因为分词是比单字更高的抽象。那么问题来了,有什么比词元更高的抽象单位吗?

摘要!但是,臣妾做不到啊? 那我们退而求其次,就在词元当中「矮子里拔将军」,找几个有代表性的「中心词」吧。那么,如何界定「中心词」呢?

突然想起给小朋友辅导,问他们「如果让你只用一个词概括高中物理,你选哪个?」

-「能量?」 -「测量。」 ……

中心词就是那个选出来的最能概括一篇文档 / 一个段落 / 一个句子的词?就是「所有词都能和这个词产生关联」?顺着这个思路,我们得出第一版公式:

概括程度(word) = ∑ 权重(word) × 关联强度(word, another_word)

现在的问题变成了「如何计算「关联强度」?」。

理想的情况是:中心词哪怕再低频,也能在某种迭代之后获得高权重,而同义词之间的关联强度也能得到提高。

呃?~~,先用「这个词和其他词的距离」来代替,试试效果吧。

试试这句:

一家加拿大公司正在尝试另一种方法:从空气里面捕获二氧化碳。方法是把空气吹向氢氧化钾溶液,形成碳酸钾。进一步加工处理之后,转变为碳酸钙颗粒。这种颗粒加热后,就会释放二氧化碳,再埋入地下的管道。现在,捕获一顿二氧化碳的成本在200美元以上,但是未来估计可以降低到100美元以下。

要人来概括的话,应该是「加拿大公司尝试固化二氧化碳」。

 1require 'rmmseg'
 2require 'pp'
 3
 4text = "一家加拿大公司正在尝试另一种方法:从空气里面捕获二氧化碳。方法是把空气吹向氢氧化钾溶液,形成碳酸钾。进一步加工处理之后,转变为碳酸钙颗粒。这种颗粒加热后,就会释放二氧化碳,再埋入地下的管道。现在,捕获一顿二氧化碳的成本在200美元以上,但是未来估计可以降低到100美元以下。"
 5
 6RMMSeg::Dictionary.load_dictionaries
 7algor = RMMSeg::Algorithm.new(text)
 8
 9h = Hash.new(0)
10seg = []
11
12loop do
13tok = algor.next_token
14break if tok.nil?
15c = tok.text.force_encoding("utf-8")
16seg << c
17h[c] += 1
18end
19
20def calc_topic(word, seg_ary, weight_h)
21acc = 0
22seg_ary.each_with_index do |w, i|
23next if w != word
24seg_ary.each_with_index do |v, j|
25    next if i == j
26    acc += weight_h[word] / (i - j).abs.to_f
27end
28end
29acc
30end
31
32weights = {}
33seg.each do |word|
34weights[word] = calc_topic(word, seg, h) if weights[word].nil?
35# puts "#{word}\t#{calc_topic(word, seg, h)}"
36end
37
38pp weights.to_a.sort_by { |e| e[1] }

来看看 Run 的结果吧:

 1[["一家", 4.832836757638071],
 2["加拿大", 5.818551043352356],
 3["以下", 5.8185510433523575],
 4["公司", 6.304058289729166],
 5["正在", 6.622685740709558],
 6["100", 6.622685740709561],
 7["尝试", 6.85776036757523],
 8["到", 6.857760367575232],
 9["另一种", 7.042608852423714],
10["降低", 7.042608852423717],
11["可以", 7.193890903705769],
12[":", 7.321123046562908],
13["估计", 7.321123046562912],
14["从", 7.430250030689892],
15["未来", 7.430250030689896],
16["但是", 7.525232109542943],
17["里面", 7.608838666919988],
18["以上", 7.683081091162415],
19["200", 7.8091469695661075],
20["在", 7.863031681345555],
21["是把", 7.911841205155077],
22["成本", 7.9118412051550795],
23["吹向", 7.9964643978665055],
24["氢氧化钾", 8.03315202889376],
25["一顿", 8.033152028893761],
26["溶液", 8.06655283861036],
27["现在", 8.124564043092153],
28["形成", 8.124564043092155],
29["碳酸钾", 8.149610425281393],
30["管道", 8.172255352817622],
31["进一步", 8.192645423739611],
32["地下", 8.210906293304825],
33["加工", 8.210906293304827],
34["埋入", 8.227145609544142],
35["处理", 8.227145609544145],
36["再", 8.241455373853904],
37["之后", 8.241455373853908],
38["转变", 8.264587080425871],
39["释放", 8.273530169856764],
40["为", 8.273530169856768],
41["就会", 8.280788234372896],
42["碳酸钙", 8.280788234372897],
43["后", 8.290384449561216],
44["加热", 8.292769187240074],
45["这种", 8.292769187240074],
46["美元", 28.107047123365092],
47["方法", 30.113845170102643],
48["空气", 30.9627829930324],
49["捕获", 31.499267859545537],
50["的", 32.29760962142574],
51["颗粒", 33.1599200935312],
52["二氧化碳", 72.03155025073727],
53["。", 186.27116977432206],
54[",", 291.5817213469649]]

可以看到,抛开「标点符号」和「虚词」,得分前五的是「二氧化碳」「颗粒」「捕获」「空气」「方法」。

呃?~~关键怎么验证算法的有效性呢?!

问小伙伴,如果你是外星人?,来地球看到一串符号。你老板让你汇报侦查情况,你决定猜一个符号,作为中心词,那么怎么猜最准?如果允许猜一组符号呢?

小伙伴说,这不可能做到。你想,中文里频率最高的字是「的」( Maybe ) ,但「的」没有半点概括能力。

我说,不对。「的」在全文档库都会出现,它的分布是均匀的,而中心词的分布是不均匀的。

这启发我,也许,考虑分布是一条路。至少理论上没有封死这条路。试想,我们可以说「词汇的集合」,但几乎不会说「集合的词汇」。当「词汇」和「集合」邻接时,几乎可以肯定是「词汇」修饰「集合」。那我们能不能通过分析全文档库找出这种修饰关系呢?

我们再来考察具体的结构。从「单字」到「词元」到「词组」,乃至「句子」「段落」……似乎都有一个共通的特性:「附着」。比如:「飞行」和「汽车」可以整合为「飞行汽车」,但其实应该是「飞行的 / 汽车」。「飞行的」是修饰,是附着在「汽车」上的。顺着这个思路,各种「修饰」都是附着在「主干」上形成更高级、更复杂的表达。「修饰语」附着在「主语」上构成「句子」。而「分论据」支撑「论点」构成「段落」……

突然,我想到,这会不会就是「互信息」?

原文链接:https://www.jianshu.com/p/befb040f0441

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能LeadAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档