Извлекайте информацию из новостных статей с помощью веб-скрейпинга и НЛП.

Альтернативным способом проверки результатов, полученных с помощью вашего алгоритма и моделей машинного обучения, могут быть новостные статьи, и что лучше сделать, если результаты были проверены и проверены журналистом.

В этой статье основное внимание будет уделено коммерческой недвижимости Нью-Йорка, а информация, которую мы будем извлекать из этих новостных статей, будет включать их адреса и общий статус собственности (ов). Процесс разбит на три этапа:

  1. Веб-парсинг - Scrapy
  2. NLP (обработка естественного языка) - набор средств естественного языка (NLTK)
  3. Использование сторонних API - API карты ZoLa NYC для зонирования и землепользования

Веб-парсинг

Веб-парсинг - очень мощный инструмент для извлечения информации, если она недоступна. В этом упражнении будет использоваться Python Scarpy, поскольку сами сайты веб-сайтов не кодируются ни JavaScript, ни AJAX. Целевые новостные сайты будут следующими:

  1. "Реальная сделка"
  2. Нью-Йорк Йимби
  3. Нью-Йорк Пост
  4. Коммерческий наблюдатель
  5. Браунстонер

Большинство этих веб-сайтов довольно легко очистить, поскольку структура сайта основана на номерах страниц.

Этап 1 и 2

Поняв структуру сайта и зная максимальное количество страниц для определенной категории, сгенерируйте список URL-адресов для очистки. Следующим этапом является извлечение всех ссылок «‹href›» для каждой статьи и этап 3 цикла.

# Sample Residential Real Estate List
resi_urls = ['https://therealdeal.com/category/residential-real-estate/page/{}/'.format(i) for i in range(1,270)]
#Sample xPath extraction from html
article_urls = response.xpath('//*[@class="entry-title entry-summary"]/a[1]/@href').extract()

Этап 3 и 4

После загрузки статьи заголовок, второй заголовок, дата публикации, содержание и теги извлекаются и сохраняются.
Извлеченный урок: Когда абзац текстовое содержимое гиперссылки одно выражение XPath не будет включать текст гиперссылки. Условие «OR (|)» в выражении XPath необходимо для включения всего текста.

# Sample code if content contants tags
content =''.join(response.xpath('//*[@class="post-content-box"]/p/text() | //p/a/text()').extract())

NLP (обработка естественного языка) с NLTK

В этом разделе будут изложены шаги, необходимые для создания распознавателя сущностей имени с NLTK для идентификации адресов, местоположений или организаций, связанных со статьей.

После преобразования всех очищенных новостных статей в чистую базу данных. Следующим шагом будет предварительная обработка текстовых данных.

  1. Удалить все стоп-слова
  2. Токенизация слов
  3. Теги части речи (теги POS)
nltk.download()
from nltk.corpus import stopwords
stop = stopwords.words('english')
def nltk_process(document):
    document = “ “.join([i for i in document.split() if i not in stop])
    sentences = nltk.sent_tokenize(document)
    sentences = [nltk.word_tokenize(sent) for sent in sentences]
    sentences = [nltk.pos_tag(sent) for sent in sentences]
    return sentence

4. Распознавание образов
Большинство адресов в новостных статьях обычно имеют следующую структуру:

205 Fifth Avenue
123 Stone Street
35th West 5th Avenue

Обратите внимание, что он не обязательно имеет традиционную структуру, как стандартные адреса, что увеличивает сложность шаблонов регулярных выражений. Приведенный ниже шаблон должен быть доступен для захвата большинства адресов в США. Ссылка на список POS-тегов

# Sample pattern for addresses
ADDRESS: {<JJ.?|CD.?>+<CD.?|JJ.?|NNP.?>+<CD|NNP>+}

5. Разделение на части
Разделение на части - это процесс, в котором предопределенный шаблон анализируется по предложениям и выводит метку, содержащую шаблон.

Использование сторонних API

Чтобы поднять эти проанализированные адреса на следующий уровень и добавить к нему геопространственный компонент, будет использоваться API. Поскольку эти статьи в основном посвящены Нью-Йорку, и только веб-сайт карты зонирования и землепользования Нью-Йорка содержит скрытый API в поле поиска. Следовательно, можно было бы объединить этот API с помощью пакета python request, чтобы помочь извлечь полный адрес и координаты для дальнейшего анализа нашей платформы. В этом случае извлекаются адрес и Brough, Block и Lot (BBL).

import urllib.parse
import requests
def address_api(address):
    if address == ' ':
        return None , None
    address = urllib.parse.quote(address.encode('utf-8'))
    url = "https://search-api.planninglabs.nyc/search?helpers[]=geosearch&helpers[]=bbl&helpers[]=neighborhood&helpers[]=zoning-district&helpers[]=zoning-map-amendment&helpers[]=special-purpose-district&helpers[]=commercial-overlay&q={}".format(address)
    try: 
        r = requests.get(url)
        if (r.status_code == 200):
            if ('json' in r.headers.get('Content-Type'))& len(r.json()) > 0:
                json = r.json()
        #         json = list(chain(*json))
                addresses = list(map(lambda x: x['label'] if x['type'] == 'lot' else None ,json))
                bbl = list(map(lambda x: x['bbl'] if x['type'] == 'lot' else None,json))
                return addresses, bbl
            else:
                return None, None
        else:
            return None, None
    except:
        return None, None

Будущие работы

В используемом NLTK есть бесконечные возможности, например, автоматическая пометка, услуги переводов, резюмирование предложений и т. Д. Список можно продолжить. Кроме того, для больших файлов с большими данными также потребуются Hadoop и Apache Spark для ускорения процесса.

Ссылка на GitHub