python机器学习项目 3:推文(Tweet)分类器 (22)

作者 : 慕源网 本文共4354个字,预计阅读时间需要11分钟 发布时间: 2021-10-23 共487人阅读

本文是Python 机器学习系列的一部分。您可以在此处找到本系列之前所有帖子的链接

介绍

本章演示了一个基于朴素贝叶斯算法的推文分类器。

推文分类器

让我们采用 Twitter 的推文,并根据给定的推文构建一个分类器。该分类器将判断一条推文是否属于“政治或体育”类别。

 

推文数据的基本示例将根据包含的文本进行分类(表 1)。

推文 ID 文本 类别
 294051752079159296  距离#ct13 开始还有 99 天。您是否知道 Chris Gayle 是赛事历史上唯一一位因 99 被解雇的球员? Sports
 291019672701255681  1 月 10 日,首相#Abe 接到了宫城县知事 Yoshihiro Murai 先生的礼节性拜访。\nhttp://t.co/EsyP40Gl Politics
 305581742104932352  上周热门话题视频:#2pack、#Draghi、养老金& #药物测试。@Europarltv 视频 http://t.co/9GVBa315vM Politics
 291520568396759041  满10折,需要10!福克纳船长与老将沃恩进行了密切的讨论,最后结束了比赛。线上的最后一个地点#BBL02 Sports

我有以下来自 Twitter 提要的“训练”数据(表 2)。

 

推文 ID 类别 文本
 306624404287275009 Sports  距离#ct13 开始还有 99 天。您是否知道 Chris Gayle 是赛事历史上唯一一位因 99 被解雇的球员?
 306481199130505216 Sports  今晚在敦巴顿队和赖斯流浪者队之间的苏格兰甲级比赛因球场冻结而推迟
 304353716117590016 Politics  @GSANetwork 提高认识和 站起来阻止#LGBT #bullying in school & 在线的。http://t.co/FWIG5vvVmi @glaad
 304844614517547008 Politics  爆炸似曾相识。我们在这个*确切*时刻经历过多少次?失败或忽略英特尔/没有闭路电视/指责游戏和无辜者死亡。

下面是未分类的推文测试数据(表 3)。

推文ID 文本
 301733794770190336  RT @aliwilgus:@tweetsoutloud NASA 对 SLS 和猎户座计划的承诺有多严重,以及人类太空飞行的未来……
 301576909517619200  RT @FardigJudith:总统国情咨文中的这句话对我说。检查出来& 分享您的#SOTU #CitizenRespo
 256056214880919553  你最喜欢打羽毛球的地方是哪里?你有一个特定的俱乐部吗?给他们点个赞!#羽毛球 #俱乐部
 300248062209691648  山姆赢得了对萨法洛娃的第一场比赛#FedCup #AusvCze http://t.co/yjyZLnjr

我将在 Python 3 代码的帮助下使用朴素贝叶斯算法对 table2 的数据进行分类或归类。让我们从下面的推文句子中提取重要的词。

def extract_tweet_words(tweet_words):    
        words = []    
        alpha_lower = string.ascii_lowercase    
        alpha_upper = string.ascii_uppercase    
        numbers = [str(n) for n in range(10)]    
        for word in tweet_words:    
        cur_word = ''    
        for c in word:    
        if (c not in alpha_lower) and (c not in alpha_upper) and (c not in numbers):    
                if len(cur_word) >= 2:    
              words.append(cur_word.lower())    
           cur_word = ''    
            continue    
            cur_word += c    
      if len(cur_word) >= 2:    
      words.append(cur_word.lower())    
return words   

从推文中获取训练数据。

def get_tweet_training_data():    
        f = open('training.txt', 'r')    
        training_data = []    
        for l in f.readlines():    
            l = l.strip()    
            tweet_details = l.split()    
            tweet_id = tweet_details[0]    
            tweet_label = tweet_details[1]    
            tweet_words = extract_words(tweet_details[2:])    
            training_data.append([tweet_id, tweet_label, tweet_words])           
        f.close()    
return training_data  

从推文中获取将被分类的测试数据。

def get_tweet_test_data():    
    f = open('test.txt', 'r')    
    validation_data = []    
    for l in f.readlines():    
        l = l.strip()    
        tweet_details = l.split(' ')    
        tweet_id = tweet_details[0]    
        tweet_words = extract_words(tweet_details[1:])    
        validation_data.append([tweet_id, '', tweet_words])    
    
    f.close()    
        
return validation_data 

获取训练数据中的单词列表。

def get_words(training_data):    
    words = []    
    for data in training_data:    
        words.extend(data[2])    
    return list(set(words))   

获取tweet的训练数据中每个词的概率。

def get_tweet_word_prob(training_data, label = None):    
    words = get_words(training_data)    
    freq = {}    
       
    for word in words:    
        freq[word] = 1    
        
    total_count = 0    
    for data in training_data:    
        if data[1] == label or label == None:    
            total_count += len(data[2])    
            for word in data[2]:    
                freq[word] += 1    
        
    prob = {}    
    for word in freq.keys():    
        prob[word] = freq[word]*1.0/total_count    
        
    return prob   
获取给定标签的概率。
def get_tweet_label_count(training_data, label):    
    count = 0    
    total_count = 0    
    for data in training_data:    
        total_count += 1    
        if data[1] == label:    
            count += 1    
    return count*1.0/total_count  

应用朴素贝叶斯模型,如下所示。

def label_tweet_data(test_data, sports_word_prob, politics_word_prob, sports_prob, politics_prob):    
    labels = []    
    for data in test_data:    
        data_prob_sports = sports_prob    
        data_prob_politics = politics_prob    
            
        for word in data[2]:    
            if word in sports_word_prob:    
                data_prob_sports *= sports_word_prob[word]    
                data_prob_politics *= politics_word_prob[word]    
            else:    
                continue    
    
        if data_prob_sports >= data_prob_politics:    
            labels.append([data[0], 'Sports', data_prob_sports, data_prob_politics])    
        else:    
            labels.append([data[0], 'Politics', data_prob_sports, data_prob_politics])    
    
    return labels   

打印标记或分类测试数据,如下所示。

def print_labelled_data(labels):    
    f_out = open('test_labelled_output.txt', 'w')    
    for [tweet_id, label, prob_sports, prob_politics] in labels:    
        f_out.write('%s %s\n' % (tweet_id, label))    
       
    f_out.close()   

阅读如下所示的训练和测试数据。

training_data = get_tweet_training_data()    
test_data = get__tweet_test_data()  

获取每个单词的概率。

word_prob = get_tweet_word_prob(training_data)    
sports_word_prob = get_tweet_word_prob(training_data, 'Sports')    
politics_word_prob = get_tweet_word_prob(training_data, 'Politics')

获取每个标签的概率。

sports_prob = get_tweet_label_count(training_data, 'Sports')    
politics_prob = get_tweet_label_count(training_data, 'Politics') 
对停用词进行标准化。
for (word, prob) in word_prob.items():    
    sports_word_prob[word] /= prob    
    politics_word_prob[word] /= prob  

标记测试数据并打印。

test_labels = label_tweet_data(test_data, sports_word_prob, politics_word_prob, sports_prob, politics_prob)    
print_labelled_data(test_labels)   
该算法的输出示例如下所示。
推文ID 类别
 301733794770190336 Politics
 301576909517619200 Politics
 305057161682227200 Sports
 286543227178328066 Politics

结论

因此,在本章中,您学习了如何构建推文分类器。

 


慕源网 » python机器学习项目 3:推文(Tweet)分类器 (22)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录