40 行代码搞定主题词提取

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

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

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

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

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

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

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

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

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

试试这句:

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

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

require 'rmmseg'
require 'pp'

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

RMMSeg::Dictionary.load_dictionaries
algor = RMMSeg::Algorithm.new(text)

h = Hash.new(0)
seg = []

loop do
    tok = algor.next_token
    break if tok.nil?
    c = tok.text.force_encoding("utf-8")
    seg << c
    h[c] += 1
end

def calc_topic(word, seg_ary, weight_h)
    acc = 0
    seg_ary.each_with_index do |w, i|
        next if w != word
        seg_ary.each_with_index do |v, j|
            next if i == j
            acc += weight_h[word] / (i - j).abs.to_f
        end
    end
    acc
end

weights = {}
seg.each do |word|
    weights[word] = calc_topic(word, seg, h) if weights[word].nil?
    # puts "#{word}\t#{calc_topic(word, seg, h)}"
end

pp weights.to_a.sort_by { |e| e[1] }

来看看 Run 的结果吧:

[["一家", 4.832836757638071],
 ["加拿大", 5.818551043352356],
 ["以下", 5.8185510433523575],
 ["公司", 6.304058289729166],
 ["正在", 6.622685740709558],
 ["100", 6.622685740709561],
 ["尝试", 6.85776036757523],
 ["到", 6.857760367575232],
 ["另一种", 7.042608852423714],
 ["降低", 7.042608852423717],
 ["可以", 7.193890903705769],
 [":", 7.321123046562908],
 ["估计", 7.321123046562912],
 ["从", 7.430250030689892],
 ["未来", 7.430250030689896],
 ["但是", 7.525232109542943],
 ["里面", 7.608838666919988],
 ["以上", 7.683081091162415],
 ["200", 7.8091469695661075],
 ["在", 7.863031681345555],
 ["是把", 7.911841205155077],
 ["成本", 7.9118412051550795],
 ["吹向", 7.9964643978665055],
 ["氢氧化钾", 8.03315202889376],
 ["一顿", 8.033152028893761],
 ["溶液", 8.06655283861036],
 ["现在", 8.124564043092153],
 ["形成", 8.124564043092155],
 ["碳酸钾", 8.149610425281393],
 ["管道", 8.172255352817622],
 ["进一步", 8.192645423739611],
 ["地下", 8.210906293304825],
 ["加工", 8.210906293304827],
 ["埋入", 8.227145609544142],
 ["处理", 8.227145609544145],
 ["再", 8.241455373853904],
 ["之后", 8.241455373853908],
 ["转变", 8.264587080425871],
 ["释放", 8.273530169856764],
 ["为", 8.273530169856768],
 ["就会", 8.280788234372896],
 ["碳酸钙", 8.280788234372897],
 ["后", 8.290384449561216],
 ["加热", 8.292769187240074],
 ["这种", 8.292769187240074],
 ["美元", 28.107047123365092],
 ["方法", 30.113845170102643],
 ["空气", 30.9627829930324],
 ["捕获", 31.499267859545537],
 ["的", 32.29760962142574],
 ["颗粒", 33.1599200935312],
 ["二氧化碳", 72.03155025073727],
 ["。", 186.27116977432206],
 [",", 291.5817213469649]]

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


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


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

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

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

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


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

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


后面的还没想好……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 第1单元 走进化学世界 1、化学是研究物质的组成、结构、性质以及变化规律的基础科学。 2、我国劳动人民商代会制造青...
    琉璃树下是我阅读 1,013评论 1 1
  • curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.re...
    gk4030阅读 2,481评论 0 2
  • 1、安全方面 1)严格学生请假手续,严禁私自离校,走读生进校离校必须佩戴走读证,各班审核走读生资格报各学部,家长探...
    清澈与明亮阅读 174评论 0 0
  • 2018-03-28 姓名:郭祥华 组别:315期六项精进努力一组 【日精进打卡第152】 【知~学习】 背诵《六...
    华英雄_712d阅读 165评论 0 0
  • 英国为什么战胜西班牙 在大航海时代和全球扩张的历史中,有一个问题始终为人们所津津乐道,那就是为什么英国人取代西班牙...
    贺村的笔记本阅读 238评论 0 1