发新帖

Python无监督抽词

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


目前很多分词工具都是基于优化元的分词法,需要词库来腹丶?竖。


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


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


        fp = open("./substr.freq")
左邻字聚合熵:分出的词左边优化关键词字的信息量,比如巴掌,基本只能用于打巴掌,优化巴掌,拍巴掌,反之过去排名关键词词,前面可以用走过去,跑过去,爬过去,打过去,混过去,睡过去,死过去,飞过去等等,信息熵就非常高。


右邻字聚合熵:分出的词右边优化关键词词的信息量,同上。


seofuwu3723061500241.jpg


                if freq_ratio > 5.0 and left_ent > 2.5 and right_ent > 2.5 and len(substr) >= 2 and not is_ascii(substr):
下面是优化关键词利用Python实现的demo(转自:http://www.wangzhanyouhua.net www.100ip.net www.seofuwu.cn 网站优化.webinfoextract.com/forum.php?mod=viewthread&tid=20)

#!/bin/sh

python ./splitstr.py > substr.freq

python ./cntfreq.py > word.freq

sort -t"    " -r -n -k 2 result > result.sort

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

import math

def compute_entropy(word_list):
        wdict={}
        tot_cnt=0
                        print "%s\t%f"%(substr.encode('utf-8'),freq)
        for w in word_list:

        try:
                if w not in wdict:
                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)
新闻 0.000100


def count_substr_freq():
        fp = open("./video.corpus")
        return ent
        str_freq={}
        str_left_word={}
        str_right_word={}
python ./findwords.py > result
        tot_cnt=0
        return p
        for line in fp:
                line=line.strip('\n')
                for i in range(l):
                        for j in range(i+1,l):

            continue
                                if j - i  0:
                                        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:
                        p *= dict[w]
字幕 0.000055


                if len(items) < 4:
                        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)
                word_freq[w]=0.0

if __name__ == "__main__":
        if len(line) < 2:
        count_substr_freq()

    word_freq={}
文排名来源:http://www.wangzhanyouhua.net www.100ip.net www.seofuwu.cn 网站优化.imyexi.com/?p=682
                                                                                
              


    fp = open("./substr.freq")
    for line in fp:
        st = line[0].decode('utf-8')
        freq = float(line[1])
                        continue
        for w in st:
            if w not in word_freq:
            word_freq[w]+=freq
    while True:
                        wdict[w] = 0
            x,y = word_freq.popitem()
            if x:
                freq=y*1.0/tot_cnt
                print "%s\t%f"%(x.encode('utf-8'),freq)
                items = line.split('\t')
            else:
                break
        except:
            break
游戏 0.000050


if __name__ == "__main__":
    count_freq()

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

def load_dict(filename):
        dict={}
        for line in fp:
舞蹈 0.000063


                line=line.strip('\n')
本方法考虑了3关键词维度:


    tot_cnt=0.0
                item=line.split('\t')
                if len(item) == 2:
        return dict

                w = w.encode('utf-8')
上海 0.000100


        p=1.0
        for w in str:
我们 0.000060


                if w in dict:
演唱会 0.000046


公司 0.000064


        fp=open(filename)
def is_ascii(s):
        return all(ord(c) < 128 for c in s)
        str_freq={}
        for line in fp:
                line = line.decode('utf-8')
                substr = items[0]
                freq = float(items[1])
关键词管 0.000051


                left_ent = float(items[2])
                right_ent = float(items[3])
                p=compute_prob(substr,dict)
                freq_ratio=freq/p

if __name__ == "__main__":
        line=line.split('\t')
        dict=load_dict('./word.freq')
                l=len(st)
        find_compact_substr(dict)

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



50视频 0.000237



教学 0.000060


轴承 0.000184


北京 0.000150


cntfreq.sh,统计每关键词字的字频:

def count_freq():
                st = line.decode('utf-8')
中国 0.000134



第三 0.000042


高清 0.000109


美女 0.000092


搞笑 0.000101


演唱 0.000085


音乐 0.000082


def compute_prob(str,dict):
0.000082


def find_compact_substr(dict):
第二 0.000080


                        dict[item[0]] = float(item[1])
少女 0.000078


最新 0.000074


广场 0.000070


世界 0.000070


现场 0.000066


娱乐 0.000066


网站优化学 0.000064


电视 0.000063


学生 0.000042


国语 0.000059


经典 0.000056


宣传 0.000053


电影 0.000049


日本 0.000045


小学 0.000045


快乐 0.000044


                                                left_word=st[i-1]
            tot_cnt+=freq
超级 0.000043


美国 0.000040



宝宝 0.000042


广告 0.000041


培训 0.000041


视频 0.000040


爱情 0.000039


老师 0.000038


动画 0.000038


教程 0.000037


广州 0.000037


学院 0.000035

精彩评论5

c8sv   学习于  2016-7-10 07:29:00
楼主是优化界超人
6i0g1   学习于  2016-7-10 07:15:46
顶顶多好,多学点优化技巧
ez2r3   学习于  2016-7-10 07:28:34
怎么优化网站说的非常好
SEO服务   学习于  2016-7-10 07:02:24
技术和方案都很好哦
68ue   学习于  2016-7-10 06:59:58
不错不错这下会优化网站了