Python无监视抽词
怎样快速准确分词,关于网站优化去道,是提与tags散开,疑息联系关系的好辅佐。
今朝许多分词东西皆是基于一元的分词法,需求词库去帮助。
经由过程对Google乌板报第一章的进修,怎样操纵统计模子停止分词。
本办法思索了3个维度:
凝集水平:两个字持续呈现的概率其实不是各自自力的水平。比方“上”呈现的概率是1×10^-5,”床”呈现的概率是1×10^-10,假如那两个字的凝集水平低,则”上床”呈现的概率该当战1×10^-15靠近,可是究竟上”上床”呈现的概率正在1×10^-11次圆,近下于各自自力概率之积。以是我们能够以为“上床”是一个词。
左邻字散开熵:分出的词右边一个字的疑息量,好比”巴掌”,根本只能用于”挨巴掌”,“一巴掌”,“拍巴掌”,反之”已往”那个词,前里能够用“走已往”,“跑已往”,“爬已往”,“挨已往”,“混已往”,“睡已往”,“死已往”,“飞已往”等等,疑息熵便十分下。
左邻字散开熵:分出的词左边一个词的疑息量,同上。
上面是一个操纵Python真现的demo(转自:webinfoextract/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
文章滥觞:imyexi/?p=682
注:相干网站建立本领浏览请移步到建站教程频讲。
相关信息
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|