顶部右侧 | 自行修改 西安网站推广
当前位置:网站首页 > SEO技术 > 正文

Python无监督抽词

seo秀 2019-05-25 38 浏览 0 评论

如何快速正确分词,对于SEO来说,是提取tags聚合,信息关联的好帮手。,目前很多分词工具都是基于一元的分词法,需要词库来辅助。,通过对Google黑板报第一章的学习,如何利用统计模型进行分词。,

如何快速正确分词,对于SEO来说,是提取tags聚合,信息关联的好帮手。

目前很多分词工具都是基于一元的分词法,需要词库来辅助。

通过对Google黑板报第一章的学习,如何利用统计模型进行分词。

本方法考虑了3个维度:

凝聚程度:两个字连续出现的概率并不是各自独立的程度。例如“上”出现的概率是1×10^-5,”床”出现的概率是1×10^-10,如果这两个字的凝聚程度低,则”上床”出现的概率应该和1×10^-15接近,但是事实上”上床”出现的概率在1×10^-11次方,远高于各自独立概率之积。所以我们可以认为“上床”是一个词。

左邻字聚合熵:分出的词左边一个字的信息量,比如”巴掌”,基本只能用于”打巴掌”,“一巴掌”,“拍巴掌”,反之”过去”这个词,前面可以用“走过去”,“跑过去”,“爬过去”,“打过去”,“混过去”,“睡过去”,“死过去”,“飞过去”等等,信息熵就非常高。

右邻字聚合熵:分出的词右边一个词的信息量,同上。

下面是一个利用Python实现的demo(转自:http://www.webinfoextract.com/forum.php?mod=viewthread&tid=20)

#!/bin/sh
 
python ./splitstr.py > substr.freq
 
python ./cntfreq.py > word.freq
 
python ./findwords.py > result
 
sort -t"    " -r -n -k 2 result > result.sort

splitstr.py,切分出字数在10以内的子字符串,计算词频,左邻字集合熵,右邻字集合熵,并输出出现10次以上的子字符串:

import math
 
def compute_entropy(word_list):
        wdict={}
        tot_cnt=0
        for w in word_list:
                if w not in wdict:
                        wdict[w] = 0
                wdict[w] += 1
                tot_cnt+=1
        ent=0.0
        for k,v in wdict.items():
                p=1.0*v/tot_cnt
                ent -= p * math.log(p)
        return ent
 
def count_substr_freq():
        fp = open("./video.corpus")
        str_freq={}
        str_left_word={}
        str_right_word={}
        tot_cnt=0
        for line in fp:
                line=line.strip('\n')
                st = line.decode('utf-8')
                l=len(st)
                for i in range(l):
                        for j in range(i+1,l):
                                if j - i  0:
                                                left_word=st[i-1]
                                        else:
                                                left_word='^'
                                        if j < l-1:                                                 right_word=st[j+1]                                         else:                                                 right_word='%'                                         str_left_word[w].append(left_word)                                         str_right_word[w].append(right_word)                                         tot_cnt+=1         for k,v in str_freq.items():                 if v >= 10:
                        left_ent=compute_entropy(str_left_word[k])
                        right_ent=compute_entropy(str_right_word[k])
                        print "%s\t%f\t%f\t%f"%(k,v*1.0/tot_cnt,left_ent,right_ent)
 
if __name__ == "__main__":
        count_substr_freq()

cntfreq.sh,统计每个字的字频:

def count_freq():
    word_freq={}
    fp = open("./substr.freq")
    tot_cnt=0.0
    for line in fp:
        line=line.split('\t')
        if len(line) < 2:
            continue
        st = line[0].decode('utf-8')
        freq = float(line[1])
        for w in st:
            if w not in word_freq:
                word_freq[w]=0.0
            word_freq[w]+=freq
            tot_cnt+=freq
    while True:
        try:
            x,y = word_freq.popitem()
            if x:
                freq=y*1.0/tot_cnt
                print "%s\t%f"%(x.encode('utf-8'),freq)
            else:
                break
        except:
            break
 
if __name__ == "__main__":
    count_freq()

findwords.py,输出凝合程度高,且左右邻字集合熵都较高的字符串:

def load_dict(filename):
        dict={}
        fp=open(filename)
        for line in fp:
                line=line.strip('\n')
                item=line.split('\t')
                if len(item) == 2:
                        dict[item[0]] = float(item[1])
        return dict
 
def compute_prob(str,dict):
        p=1.0
        for w in str:
                w = w.encode('utf-8')
                if w in dict:
                        p *= dict[w]
        return p
 
def is_ascii(s):
        return all(ord(c) < 128 for c in s)
 
def find_compact_substr(dict):
        fp = open("./substr.freq")
        str_freq={}
        for line in fp:
                line = line.decode('utf-8')
                items = line.split('\t')
                if len(items) < 4:
                        continue
                substr = items[0]
                freq = float(items[1])
                left_ent = float(items[2])
                right_ent = float(items[3])
                p=compute_prob(substr,dict)
                freq_ratio=freq/p
                if freq_ratio > 5.0 and left_ent > 2.5 and right_ent > 2.5 and len(substr) >= 2 and not is_ascii(substr):
                        print "%s\t%f"%(substr.encode('utf-8'),freq)
 
if __name__ == "__main__":
        dict=load_dict('./word.freq')
        find_compact_substr(dict)

对3万条视频的标题,抽出的频率最高的50个词如下:

50视频 0.000237

轴承 0.000184

北京 0.000150

中国 0.000134

高清 0.000109

搞笑 0.000101

新闻 0.000100

上海 0.000100

美女 0.000092

演唱 0.000085

音乐 0.000082

—— 0.000082

第二 0.000080

少女 0.000078

最新 0.000074

广场 0.000070

世界 0.000070

现场 0.000066

娱乐 0.000066

大学 0.000064

公司 0.000064

舞蹈 0.000063

电视 0.000063

教学 0.000060

我们 0.000060

国语 0.000059

经典 0.000056

字幕 0.000055

宣传 0.000053

钢管 0.000051

游戏 0.000050

电影 0.000049

演唱会 0.000046

日本 0.000045

小学 0.000045

快乐 0.000044

超级 0.000043

第三 0.000042

宝宝 0.000042

学生 0.000042

广告 0.000041

培训 0.000041

视频 0.000040

美国 0.000040

爱情 0.000039

老师 0.000038

动画 0.000038

教程 0.000037

广州 0.000037

学院 0.000035

文章来源:http://www.imyexi.com/?p=682

相关推荐

同一篇文章,在多个栏目,对SEO有影响吗?
同一篇文章,在多个栏目,对SEO有影响吗?

在日常SEO工作中,我们经常会遇到一个问题,同一篇文章,在多个栏目出现,这看似非常简单的一个问题,却让很多SEO新人很纠结。 那么,同一篇文...

51分钟前 SEO猫

B2B是什么意思,如何利用B2B平台做外链?
B2B是什么意思,如何利用B2B平台做外链?

在以往的网络营销中,企业经常喜欢利用传统广告工具去推广,比如:B2B平台,虽然新媒体平台对B2B网站不断的冲击,转化率也在逐渐降低,但从目前来看,仍然是有利可图...

1小时前 SEO猫

为什么你的网址排名总是错误的?
为什么你的网址排名总是错误的?

在SEO工作中你是否经常遇到这一种情况:你的网址排名,总是与你的预期不符合,对于特定关键词,你明明想要排名这个页面,可搜索引擎偏偏给你排名另外一个网址。&nb...

1小时前 SEO猫

浅析: “简单搜索永无广告”百度战略发展的试金石?
浅析: “简单搜索永无广告”百度战略发展的试金石?

5月26日,李彦宏在贵阳大数据产业博览会上发表讲话,正式推出百度智能搜索APP,简单搜索,并称“简单搜索永无广告”一石激起千层浪,引发广大网民热议。 ...

2小时前 SEO猫

网络营销成本削减,如何低成本营销,推进SEO项目!
网络营销成本削减,如何低成本营销,推进SEO项目!

如果你长期从事SEO行业,有的时候会遇到网站推广费用突然调整,网络营销成本必须降低的事情,我们知道这是公司的战略调整,作为SEO人员无权过问,在本身预算就比较紧...

2小时前 SEO猫

如何通过竞争对手分析,让网站排名靠前?
如何通过竞争对手分析,让网站排名靠前?

当你入职SEO这个行业第一天起,势必你的工作就是每天与搜索引擎打交道,当我们私下谈论让网站排名靠前的时候,其实简单理解,就是如何超越百度排名靠前的那些网站,言外...

2小时前 SEO猫

如何利用“麦当劳优惠券”这种“内部优惠券”建立链接!
如何利用“麦当劳优惠券”这种“内部优惠券”建立链接!

优惠券,对于任何一个电商网站都是快速获取流量的一个重要手段,对于SEO而言,它可以让你短时期内品牌词的搜索量迅速提升,从而影响整个站点的权重,特别是一些行业平台...

2小时前 SEO猫

网站建设费用:做个网站要多少钱?
网站建设费用:做个网站要多少钱?

建网站需要多少钱,这是作为建站公司经常听到的一个问题,简单来讲,每个行业的网站建设费用都不相同,其中,web前端开发与程序设计,不同的公司差异很大。 ...

2小时前 SEO猫

搜索引擎SEO:小白应避免的5个错误!
搜索引擎SEO:小白应避免的5个错误!

当你刚进入搜索引擎SEO这个领域的时候,很容易忽略一些细节,有的时候在SEO工作中,不经意之间便会产生一些小错误。为了能够让大家更好的避免身处这些陷阱,蝙蝠侠I...

3小时前 SEO猫

百度网址提交:常见的百度收录提交入口有哪些?
百度网址提交:常见的百度收录提交入口有哪些?

任何一个网站上线,我们要做的第一件事儿,就是网站收录提交,通过网站收录入口,尝试让百度优先抓取与收录网站。 百度官方在这方面,提供了多种渠道收录...

3小时前 SEO猫

欢迎 发表评论: