丹東網(wǎng)站建設(shè)磁力庫
一、GDELT介紹
GDELT ( www.gdeltproject.org ) 每時每刻監(jiān)控著每個國家的幾乎每個角落的 100 多種語言的新聞媒體 -- 印刷的、廣播的和web 形式的,識別人員、位置、組織、數(shù)量、主題、數(shù)據(jù)源、情緒、報價、圖片和每秒都在推動全球社會的事件,GDELT 為全球提供了一個自由開放的計算平臺。
GDELT 主要包含兩大數(shù)據(jù)集: Event Database (事件數(shù)據(jù)庫) 、 Global Knowledge Graph (GKG, 全球知識圖譜),記錄了從1969 年至今的新聞,并于每十五分鐘更新一次數(shù)據(jù)。
二、研究內(nèi)容
本次研究數(shù)據(jù)來自 gdelt 數(shù)據(jù)庫,爬取 2022.01.01-2022.07.20 所有 export 和 mentions 表,從中提取俄烏 沖突相關(guān)數(shù)據(jù),由此進行分析。主要分析內(nèi)容如下:
- 基于BERT實現(xiàn)GDELT新聞事件數(shù)據(jù)中事件正文文本的情感分析
- 基于MySQL的本地數(shù)據(jù)庫導入、查詢和存儲
- 基于JavaScript和echarts的數(shù)據(jù)可視化圖表庫對新聞事件數(shù)據(jù)進行多方面可視化
- 將可視化界面部署到服務器上以供其他用戶通過網(wǎng)址查看
- 其他算法進行情感分析
三、項目實施方法設(shè)計
1、使用語言
前段靜態(tài)頁面: html 、 css 、 JavaScript 、 echarts
連接數(shù)據(jù)庫頁面:增加 php 連接 MySQL
數(shù)據(jù)處理: Pycharm+Python , Jupyter+Python
2、項目流程

?四、具體實現(xiàn)與測試
1、數(shù)據(jù)集下載
def get_data(url):# 獲取urlfile_name = url.split("gdeltv2/")[1].split(".zip")[0]r = requests.get(url)temp_file=open("./temp.zip", "wb")temp_file.write(r.content)temp_file.close()try:my_zip=zipfile.ZipFile('./temp.zip','r')my_zip.extract(file_name,path="./data")my_zip.close()except Exception:print("%s not exist" % file_name)return None
def get_data_df(): #日期讀取f=open("date.txt")date=[]time=[]for i in f.readlines():date.append(i.strip("\n"))f.close()f=open("time.txt")for i in f.readlines():time.append(i.strip("\n"))f.close()#地址整合url1 = "http://data.gdeltproject.org/gdeltv2/%s.export.CSV.zip"url2 = "http://data.gdeltproject.org/gdeltv2/%s.mentions.CSV.zip"for i in date:for j in time:str_real_time=i+jget_data(url1%str_real_time)get_data(url2%str_real_time)print("%s-complete"%i)
下載 2022.01.01-2022.07.20 的數(shù)據(jù), 數(shù)據(jù)量大約 20GB ,下載完成后, export 表和 mentions 表混合放置,因此需要將表按月分類放置,代碼如下:
import os
import shutil
for i in range(1,8):src_folder="./totaldata/20220"+str(i)tar_folder="./totaldata/20220"+str(i)files=os.listdir(src_folder)for file in files:src_path=src_folder+'/'+filefor file in files:# 將每個文件的完整路徑拼接出來src_path = src_folder + '/' + fileif os.path.isfile(src_path):tar_path = tar_folder + '/' + file.split('.')[-2]print(tar_path)# 如果文件夾不存在則創(chuàng)建if not os.path.exists(tar_path):os.mkdir(tar_path)# 移動文件shutil.move(src_path, tar_path)
為了更方便處理,我們將 export 表的數(shù)據(jù)合并, mentions 表的數(shù)據(jù)合并,代碼如下:
os.chdir(Folder_Path)
file_list=os.listdir()
for i in range(1,len(file_list)):df=pd.read_csv(file_list[i],sep='\t')df.to_csv(SaveFile_Path+"/"+SaveFile_Name,encoding="utf_8_sig",index=False,header=None,mode='a+')sys.stdout.write("\r已合并:%.2f%%"%float((i/len(file_list))*100))sys.stdout.flush()
2、數(shù)據(jù)集處理
(1)查看空字段數(shù)量并排序
is_null=df_01.isnull().sum().sort_values(ascending=False)
is_null[is_null>row*0.85]#篩選出空值數(shù)量大于85%的數(shù)據(jù)
(2)刪除缺失率大于85%字段
drop_columns=['Actor2Type3Code','Actor1Type3Code','Actor2Religion2Code',
'Actor1Religion2Code','Actor2EthnicCode','Actor1EthnicCode',
'Actor2Religion1Code','Actor2KnownGroupCode','Actor1Religion1Code',
'Actor1KnownGroupCode','Actor2Type2Code','Actor1Type2Code']
df_01.drop(drop_columns,axis=1,inplace=True)
得到結(jié)果如下:
3、數(shù)據(jù)導入MySQL與分析?
(1)創(chuàng)建數(shù)據(jù)庫
這里值得注意的是,很多字段在后續(xù)分析中沒有用到,但還是導入進去了,為了和元數(shù)據(jù)保持一致性。
CREATE TABLE `export` (
`GLOBALEVENTID` int NOT NULL,
`SQLDATE` bigint,
`MonthYear` bigint,
`Year` bigint,
`FractionDate` bigint,
`Actor1Code` varchar(255),
`Actor1Name` varchar(255),
`Actor1CountryCode` varchar(255),
`Actor1Type1Code` varchar(255),
`Actor2Code` varchar(255),
`Actor2Name` varchar(255),
`Actor2CountryCode` varchar(255),
`Actor2Type1Code` varchar(255),
`IsRootEvent` varchar(255),
`EventCode` varchar(255),
`EventBaseCode` varchar(255),
`EventRootCode` varchar(255),
`QuadClass` int,
`GoldsteinScale` double,
`NumMentions` int,
`NumSources` int,
`NumArticles` int,
`AvgTone` double,
`Actor1Geo_Type` varchar(255),
`Actor1Geo_FullName` varchar(255),
`Actor1Geo_CountryCode` varchar(255),
`Actor1Geo_ADM1Code` varchar(255),
`Actor1Geo_ADM2Code` varchar(255),
`Actor1Geo_Lat` double,
`Actor1Geo_Long` double,
`Actor1Geo_FeatureID` varchar(255),
`Actor2Geo_Type` varchar(255),
`Actor2Geo_FullName` varchar(255),
`Actor2Geo_CountryCode` varchar(255),
`Actor2Geo_ADM1Code` varchar(255),
`Actor2Geo_ADM2Code` varchar(255),
`Actor2Geo_Lat` double,
`Actor2Geo_Long` double,
`Actor2Geo_FeatureID` varchar(255),
`ActionGeo_Type` varchar(255),
`ActionGeo_FullName` varchar(255),
`ActionGeo_CountryCode` varchar(255),
`ActionGeo_ADM1Code` varchar(255),
`ActionGeo_ADM2Code` varchar(255),
`ActionGeo_Lat` double,
`ActionGeo_Long` double,
`ActionGeo_FeatureID` varchar(255),
`DATEADDED` bigint,
`SOURCEURL` text,
PRIMARY KEY (`GLOBALEVENTID`)
);
(2)導入數(shù)據(jù)
LOAD DATA INFILE 'E:/term/code/mergedata/export/export_202201.csv' INTO TABLE
`export`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;
(3)年份處理和簡單查詢
DELETE
FROM rus_and_ukr
WHERE `MonthYear`<202201
SELECT COUNT(GLOBALEVENTID) FROM export -- 21504131