当前位置:   article > 正文

基于自然语言处理的灾难预警_基于深度学习和自然语言处理的灾难预测

基于深度学习和自然语言处理的灾难预测

项目简介

Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话。迄今为止,Twitter的可货币化日活跃用户达1.86亿。与此同时,Twitter也已成为突发紧急情况时人们的重要沟通渠道。由于智能手机无处不在,人们可以随时随地发布他们正在实时观察的紧急情况。 因此,越来越多的救灾组织和新闻机构对通过程序方式监视Twitter产生了兴趣。
但是,我们并不清楚一个用户在推特上发布的推文是否是真实的正在发生的灾难。 举个例子:
在这里插入图片描述

作者明确使用了“ABLAZE”一词,但仅仅是为了形容火烧云,并非真正的火焰燃烧。这对于人类来说是显而易见的,但是对于机器来说便很难分辨该用户是否正在预告真实发生的火灾。
因此,在这个项目中,我将建立一个预测推文发布灾难真实性的机器学习模型,该模型可以预测哪些推文发布的是真实发生的灾难,哪些是虚假的灾难,从而为相关组织网络监测灾难发生及救援提供帮助。

数据集介绍

该数据集共包含三个文件,分别为:
train.csv — 训练集
test.csv — 测试集
sample_submission.csv。— 样本提交文件

数据集中包含的列:
列名 解释
id 每条推文的唯一标识符
text 推特的内容
location 推文发送的位置(可以为空白)
keyword 推文中的特定关键字(可以为空白)
target 仅在train.csv中存在,表示推文中描述灾难的真假,真实为1,虚假为0

其中,测试集包含7613个样本,训练集包含3263个样本。

1.导入库

首先导入本次建模需要的相关库,其中主要包括以下四个部分:
数据处理相关

import numpy as np  #数据计算与处理
import pandas as pd #数据计算与处理
import re            #用于字符串的匹配,调用方法
  • 1
  • 2
  • 3

自然语言处理工具

import nltk  
from nltk.corpus import stopwords           #停用词表
from nltk.stem.porter import PorterStemmer #词干提取
from collections import Counter             #统计频数
  • 1
  • 2
  • 3
  • 4

可视化工具

import seaborn as sns 
import matplotlib.pyplot as plt  
import cufflinks as cf  
#如果使用online模式,那么生成的图形是有限制的,我们这里先设置为offline模式,这样就避免了出现次数限制问题。
cf.go_offline() 
from wordcloud import WordCloud, STOPWORDS      #词云图
from IPython.core.display import display, HTML  #显示功能
import plotly.graph_objects as go  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

建模相关

from tensorflow.keras.preprocessing.text import Tokenizer  #分词器
from tensorflow.keras.preprocessing.sequence import pad_sequences   
                                #序列处理
import tensorflow as tf       #神经网络库
from tqdm import tqdm         #时间处理
  • 1
  • 2
  • 3
  • 4
  • 5

2.加载数据并查看

运用pandas分别读取训练集,测试集等。

train = pd.read_csv("D:/机器学习/NLP/nlp-getting-started/train.csv")
test = pd.read_csv("D:/机器学习/NLP/nlp-getting-started/test.csv")
submission =  pd.read_csv("D:/机器学习/NLP/nlp-getting-started/sample_submission.csv")
  • 1
  • 2
  • 3

查看训练集前五行

train.head()   
  • 1

结果如下:
在这里插入图片描述

查看测试集前五行

test.head()    
  • 1

结果如下:
在这里插入图片描述

3.数据可视化

首先,运用plotly绘制真实虚假灾难数量对比的饼图,该饼图描述了正例反例在训练样本中的占比,检验数据平衡性。

#计算0,1有在target列中有多少重复值
counts_train = train.target.value_counts(sort=False)
labels = counts_train.index   
values_train = counts_train.values 
  • 1
  • 2
  • 3
  • 4
#输入饼图数据
data = go.Pie(labels=labels, values=values_train ,pull=[0.03, 0]) 
#设置标题   
layout = go.Layout(title='Comparing Tweet is a real disaster (1) or not (0) in %') 
#绘制饼图
fig = go.Figure(data=[data], layout=layout)                                #设置饼图的显示,标签,百分比,值
fig.update_traces(hole=.3, hoverinfo="label+percent+value")              #在饼图的中心添加注释
fig.update_layout(annotations=                                          
                  [dict(text='Train',
x=0.5, y=0.5, 
font_size=20, 
showarrow=False)])
  #显示饼图
fig.show()                                                                
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果如下:
在这里插入图片描述
由饼图可知,在训练集中,灾难真实发生的样本(1)共有3271个,占总体的43%,非真实发生的样本(0)有4342个,占总体的57%。总体来说比例较为均衡,可以进行后续建模。
然后,为了进一步了解灾难推文的大致内容,本文利用wordcloud绘制推文的内容的词云。
首先自行将一些网络常用词加入停用词表。

STOPWORDS.add('https')   
STOPWORDS.add('co')
STOPWORDS.add('amp')
  • 1
  • 2
  • 3

然后定义绘制词云图的函数:

#定义绘制词云函数
def Plot_world(text):
    comment_words = ' '
    stopwords = set(STOPWORDS)    #创建停用词元素集

 #遍历text中的值,将每个值转换成字符串并分割
    for val in text:    
        val = str(val)           
        tokens = val.split()  
   #遍历分割后的字符串,并将每个词转换成小写
        for i in range(len(tokens)):    
            tokens[i] = tokens[i].lower()  
   #遍历字符串中的所有词,将每个词用空格隔开 
        for words in tokens: 
            comment_words = comment_words + words + ' '   
#设置词云格式并生成词云
    wordcloud = WordCloud(width = 4000, height = 3000,    #宽高
                    background_color ='white',   #背景色
                    stopwords = stopwords,       #停用词
                    min_font_size = 10            #最小字号
).generate(comment_words) 
  #绘制词云                        
    plt.figure(figsize = (12, 12), 
facecolor = 'white', 
edgecolor = 'white' ) 
    plt.imshow(wordcloud) 
    plt.axis("off")            #不显示坐标轴
    plt.tight_layout(pad = 0)  #图像自动调整,设置间距
  #显示词云
    plt.show() 
运行该函数绘制text词云
text = train.text.values
Plot_world(text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

结果如下:
在这里插入图片描述

4.数据清洗

众所周知,在进行建模之前,我们必须首先进行数据的预处理,以便于后续进一步处理。因此,本文将进行一些基本的网络文本清理工作,例如去除网址,去除网络标签,删除标点符号,删除常用表情符号,拼写矫正等。
1. 删除网址

#定义去除网址函数
def remove_URL(text):
    url = re.compile(r'https?://\S+|www\.\S+')
    return url.sub(r'',text)
#删除text列中的网址
train['text']=train['text'].apply(lambda x : remove_URL(x))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. 删除HTML标签

#定义删除HTML标签函数
def remove_html(text):
    html=re.compile(r'<.*?>')
    return html.sub(r'',text)
#删除text列中的HTML标签
train['text']=train['text'].apply(lambda x : remove_html(x))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3. 删除表情符号
首先,搜索推特中常用的表情符号,查询他们的代码点(https://emojipedia.org/relieved-face/),将需要删除的表情符号记录。然后开始编写代码。

#定义删除表情符号的函数
def remove_emoji(text):
    emoji_pattern = re.compile("["
                           #表情(
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/344936?site
推荐阅读
相关标签