python机器学习项目 3:推文(Tweet)分类器 (22)
本文是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 |
结论
因此,在本章中,您学习了如何构建推文分类器。
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!