使用NLP和ML来提取和构造Web数据

本文展示了如何结合NLP和机器学习从战争研究所(ISW)的文档中提取结构化数据。通过web爬取获取信息,利用自然语言处理进行命名实体识别,提取地点和人名,然后通过TF-IDF进行关键词提取和主题模型构建。最后,数据被整合并存储为JSON格式,便于后续分析和可视化。
摘要由CSDN通过智能技术生成

作者|Conner Brew 编译|VK 来源|Towards Data Science

介绍

在本文中,我们将创建一个基于战争研究所(ISW)的结构化文档数据库。ISW为外交和情报专业人员提供信息产品,以加深对世界各地发生的冲突的了解。

要查看与本文相关联的原始代码和Notebook,请访问以下链接:https://colab.research.google.com/drive/1pTrOXW3k5VQo1lEaahCo79AHpyp5ZdfQ?usp=sharing

要访问Kaggle上托管的最终结构化数据集,请访问以下链接:https://www.kaggle.com/connerbrew2/isw-web-scrape-and-nlp-enrichment

本文将是一个关于web抽取、自然语言处理(NLP)和命名实体识别(NER)的练习。对于NLP,我们将主要使用开源Python库NLTK和Spacy。

本文旨在演示web提取和NLP的一个用例,而不是关于这两种技术使用的全面初学者教程。如果你是NLP或web提取的新手,我建议你遵循不同的教程,或者浏览Spacy、BeautifulSoup和NLTK文档页面。

# 导入库

import requests
import nltk
import math
import re
import spacy
import regex as re
import pandas as pd
import numpy as np
import statistics as stats
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import json

# 你需要从NLTK下载一些包。

from bs4 import BeautifulSoup 
from nltk import *
nltk.download('stopwords')
nltk.download('punkt')
from nltk.corpus import stopwords

# #在大多数环境中,你需要安装NER-D。

!pip install ner-d
from nerd import ner

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.text import TfidfVectorizer

初始化变量

首先,我们将初始化最终结构化数据中需要的数据字段。对于每个文档,我要提取标题、发布日期、人名、地名和其他各种信息。我们还将增强文档中已经存在的信息—例如,我们将使用文档中的地名来获取相关的坐标,这对于以后可视化数据非常有用。

# 初始化最终数据集的数据字段

dates=[]
titles=[]
locations=[]
people=[]
key_countries=[]
content_text=[]
links=[]
coord_list=[]
mentioned_countries=[]
keywords=[]
topic_categories=[]

# 为后面的主题模型初始化簇变量

cluster_keywords=[]
cluster_number=[]

# 使用SPACY库初始化NLP对象
nlp = spacy.load("en_core_web_sm")

提取href

我们将从ISW的生产库中提取文档。首先,我们将抓取“浏览”页面以获取每个产品的单独href链接。然后我们将这些链接存储在一个列表中,供提取函数稍后访问。

# #从ISW浏览页面获取产品链接

urls=['http://www.understandingwar.org/publications?page={}'.format(i) for i in range(179)]
hrefs=[]

def get_hrefs(page,class_name):
  page=requests.get(page)
  soup=BeautifulSoup(page.text,'html.parser')
  container=soup.find_all('div',{'class':class_name})
  container_a=container[0].find_all('a')
  links=[container_a[i].get('href') for i in range(len(container_a))]
  for link in links:
    if link[0]=='/':
      hrefs.append('http://www.understandingwar.org'+link)

for url in urls:
  get_hrefs(url,'view-content')

Web爬取

我们将要编写的前几个函数是相当简单的文本提取。本教程不是关于BeautifulSoup用法的教程,要了解Python中的web爬取,请查看这里的文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

获得日期

对于我们的第一个函数,我们将提取发布日期。它扫描从产品网页中提取的html文档,并找到一个类为“submitted”的字段。这是我们的生产日期。

获得标题

接下来,我们需要产品名称。同样,这个字段被方便地标记为“title”类。

获取所有文本

最后,我们将提取文档的全文。当我提取文本时,我通常遵循“先提取,后过滤”的web提取方式。这意味着,在最初的文本提取中,我对文本执行最少的过滤和处理。我更愿意在以后的分析中进行处理,因为这是必要的。但是,如果你想更进一步,你可能希望对提取的文本进行比下面函数演示的更多的预处理。

对于我的get_contents函数,我坚持最基本的原则——我在黑名单中列出了一些不想被提取的文本。然后从页面中提取所有文本并将其附加到一个临时字符串中,该字符串又被附加到列表content_text中。

# 提取发布数据

def get_date(soup):
  try:
    data=soup.find('span',{'class':'submitted'})
    content=data.find('span')
    date=content.get('content')
    dates.append(date)
  except Exception:
    dates.append('')
    pass

# 提取产品标题
def get_title(soup):
  try:
    title=soup.find('h1',{'class':'title'}).contents
    titles.append(title[0])
  except Exception:
    titles.append('')
    pass

# 提取产品的文本内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值