Python机器学习:贝叶斯文本分类器

来源:互联网 发布:淘宝网店铺简介范文 编辑:程序博客网 时间:2024/04/28 15:52

最近在我的网站骂我的人比较多,想写一个语义分类器,让电脑自动屏蔽那些骂人的评论,怎么办呢?这就用到了一个机器学习的算法——贝叶斯文本分类器。这个算法很有用处,可以让电脑识别人类语言,如果加上一点心理学的知识,可以让电脑理解人类的文章并让电脑判断作者的个性特征,这就复杂了,现在我们先做一个简单的示范。

  1. 首先是需要一个样本集,用于训练文本分类器:这里面用到了一个分词算法【cs.perse】,其实是一个机械分词算法,cs.py 文件的代码粘贴在最下面。

  2. 下面的函数利用样本创建一个词表,也就是所有词的集合

  3. 下面的函数将一个词表转换成词向量

  4. 训练样本得到脏话/非脏话的词分布概率

  5. 利用贝叶斯条件概率,计算输入的一句话到底是不是骂人的话,如果是骂人的话,就返回1,否则返回0

  6. 最后测试一下【'fuck you! mother fucker!'】这句话,输出结果为:1

##########以下是cs.py文件的代码####################

#coding:utf8

import time

import pandas as pd

import string

def load_words(dic_file='./Freq/SogouLabDic.dic'):

    t=time.time()

    word_dic={}

    first_word_dic={}

    for line in open(dic_file):

        line=unicode(line,'utf8').split()

        word=line[0]

        word_len=line[1]

        sex=line[2] if len(line)==3 else None

        first_word_dic.setdefault(word[0],[])

        first_word_dic[word[0]].append(word)

        word_dic[word]=(word_len,sex)

    for first_word,words in first_word_dic.items():

        word_dic[first_word]=sorted(words,key=lambda x:len(x),reverse=False)

    print 'load_words time:',time.time()-t

    return first_word_dic,word_dic

first_word_dic,word_dic=load_words()

model_dic={

    'letters':string.ascii_letters,

    'digits':string.digits,

    'punctuation':string.punctuation,

    }

def match_ascii(i,sentence):

    result=''

    for i in range(i,len(sentence)):

        if not sentence[i] in string.ascii_letters:break

        result +=sentence[i]

    return result

def match_word(i,sentence,first_word_dic=first_word_dic):

    first_word=sentence[i]

    if not first_word_dic.has_key(first_word):

        if first_word in string.ascii_letters:

            return match_ascii(i,sentence)

        return ' '

    words=first_word_dic[first_word]

    for word in words:

        if sentence[i:i+len(word)]==word:

            return word

    return first_word

def perse(sentence):

    if sentence:

        words=[]

        i=0

        while i <len(sentence):

            matched_word=match_word(i,sentence)

            if not matched_word==' ':words.append(matched_word)

            i +=len(matched_word)

        return words

if __name__=='__main__':

    sentence=u'我曾经跨过山和abd dfdf大海!互,联网词语搭配关系库来自于对SOGOU搜索引擎所索引到的中文互联网语料的统计分析,统计所进行的时间是2006年10月,涉及到的互联网语料规模在1亿页面以上。涉及到的搭配样例超过2000万,涉及到的高频词超过15万。'

    words=perse(sentence)

    for w in words :print w

0 0
原创粉丝点击