Авторы: Рехам Рафи Ахмед и Мастане Лаэль Абдул Гаффар Куреши

Данные — это секретный ингредиент, который может сломать или создать рецепт, когда речь идет о моделях машинного обучения. Здесь, в нашем проекте Создание библиотек и инструментов НЛП с открытым исходным кодом для арабского языка, этот ингредиент не совсем подавался на золотом блюде, поэтому мы отправим вас в путешествие по сбору наших данных.

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

Из-за особенностей арабского языка и сложности его структуры, помимо факта наличия множества диалектов, это была непростая задача, и было принято решение начать с использования только современного стандартного арабского языка (MSA) при разработке наших моделей. для первой фазы проекта, и здесь появилась первая неясность для сбора данных, заключающаяся в отсутствии наличия чистых данных MSA.

Мы поговорим о нашем путешествии по сбору данных, которое началось, немного не зная, чего мы конкретно пытаемся достичь. Тем не менее, благодаря успешной стратегии Омдены «снизу-вверх», кусочки головоломки начали показывать полную картину. В следующих строках мы постараемся сконцентрироваться на нашем накопленном опыте сбора данных.

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

Сбор данных на современном стандартном арабском языке

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

Тестовые данные используются для измерения производительности, например точности или эффективности алгоритма, используемого для обучения машины.

Мы стремились собрать наборы данных MSA, указанные для различных моделей нашего инструментария НЛП, а именно:

  • Анализ настроений
  • Морфологическое моделирование
  • Распознавание именованных объектов (NER)
  • Диалектная идентификация
  • Вложения слов
  • лемматизация
  • Тегирование речи

Наш подход

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

Использование наборов данных НЛП с открытым исходным кодом:

Вы можете найти здесь Наборы данных Yarub Training.

Плюсы

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

Проблемы

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

Веб-скрапинг и сбор данных

Прежде чем мы углубимся в нашу работу по очистке данных, мы должны указать на то, что важной частью очистки веб-страниц является этичность, поскольку мы никогда не должны очищать сайт, которому его владелец не разрешает сканировать свой веб-сайт. Вы можете легко проверить это, указав косую черту и robots.txt после URL-адреса веб-сайта, который вам нужно просканировать, и если это разрешено, вы получите что-то вроде этого:

Пользовательский агент: *

Позволять: /

Для получения более подробной информации об этом вы можете просмотреть Google Search Central о файлах robots.txt документация.

Использование этого метода имеет плюсы и минусы:

Плюсы

Поскольку мы стремились использовать только MSA, очистка данных даст нам некоторый контроль над содержанием наших наборов данных путем выбора источников.

Проблемы

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

Скрапинг новостей с сайтов газет

Используя пакет python, предназначенный для очистки новостных статей, который называется газетой, и вы можете установить его с помощью следующей команды:

pip install newspaper

Затем следуйте инструкциям, указанным на странице документации:

import newspaper
news_paper = newspaper.build('Here the newspaper url') # ~15 seconds
for article in news_paper.articles:
    print article.url # filters to only valid news urls
    print news_paper.size() # number of articles
    print news_paper.category_urls()
    print news_paper.feed_urls()
# ^ categories and feeds are cached for a day (adjustable)
# ^ searches entire newspaper sitemap to find the feeds, not just homepage
#### build articles, then download, parse, and perform NLP
for article in news_paper.articles[:5]:
   article.download() # take's a while if you're downloading 1K+ articles

print news_paper.articles[0].html

### parse an article for its text, authors, etc

first_article = news_paper.articles[0]
first_article.parse()

print first_article.text
print first_article.top_img
print first_article.authors
print first_article.title

Парсинг сайта цитат арабских книг

Мы использовали noor-book.com, где есть раздел, позволяющий читателям писать цитаты из прочитанных книг. Сайт содержит почти 80 000 цитат.

Мы использовали библиотеку Selenium и BeautifulSoup для очистки этого сайта, и основная проблема, с которой мы столкнулись, заключается в том, что сайт использует бесконечную прокрутку, что означает, что больше цитат отображается только при прокрутке страницы вниз.

Очистить бесконечную прокрутку может быть очень сложно, и после изучения множества кодов и методов мы попытаемся в следующих строках объяснить код, используемый для очистки сайта:

Сначала мы импортируем необходимые библиотеки:

Модуль ОС:

Это различный интерфейс операционной системы.

Здесь мы использовали (os.environ) как отображающий объект, представляющий строковое окружение.

Селеновая библиотека:

Мы будем импортировать веб-драйвер из библиотеки Selenium. Тем не менее, сначала вам нужно добавить папку, содержащую бинарные файлы WebDriver, в системный путь с помощью документации Selenium здесь.

Библиотека времени:

Использовал его для применения функции сна, чтобы дать серверу время, необходимое для выполнения заданных запросов без перегрузки.

Библиотека BeautifulSoup:

Его использование сопровождается некоторыми знаниями о структуре веб-страницы и некоторых тегах HTML.

Нам нужно определить, где лежат части, которые нам нужно очистить, и вы можете использовать библиотеку BeautifulSoup для их анализа.

import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
import pandas as PD

chromedriver = "/home/chromedriver"
os.environ["webdriver.chrome.driver"] = chromrdriver
driver = webdriver.Chrome("D:\chromedriver_win32\chromedriver.exe")
driver.get("https://www.noor-book.com/book-quotes")
screen_height = driver.execute_script("return window.screen.height;")   # get the screen height of the web
ScrollNumber = ”””” Here to put the number of scrolls needed to scrape all content wanted from the site”””
for i in range(1,ScrollNumber):
    driver.execute_script("window.scrollTo(0,100000)")  
    time.sleep(0.5)### 

quotes = []
soup = BeautifulSoup(driver.page_source)
for a in soup.find_all('div', attrs={'class':'quote-content-child'}):
    qoute=a.find('span', attrs={'class':'more'})
    qoutes.append(qoute.text)
driver.close()

Удаление твитов из Twitter

Идея использования очищенных твитов исходит из идеи, чтобы учетные записи в основном использовали MSA в своих твитах, как:

  • Счета официальных органов.
  • Политики.
  • Газетные счета.

Здесь мы использовали Tweepy для запроса API Twitter, для использования которого у вас должна быть учетная запись разработчика Twitter, а для этого вам необходимо:

Во-первых, заведите аккаунт в Твиттере.

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

После того, как вы получили свою учетную запись, вы можете следовать следующему коду:

import tweepy
from tweepy import OAuthHandler
# These are hidden to comply with Twitter's API terms and conditions
consumer_key = '-----------’
consumer_secret = '---------’
access_token = '----------'
access_secret = '--------'

auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)

api = tweepy.API(auth, wait_on_rate_limit=True)

Вы можете получить твиты для любой учетной записи, которую вы хотите, но с ограничением в 3200 твитов из последних твитов вы не можете очистить более 18 000 твитов за 15-минутное окно.

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

Очистка и обработка данных

Поскольку большая часть извлеченных данных может содержать некоторые нежелательные функции, которые будут использоваться при обучении различных моделей НЛП, становится необходимой некоторая очистка данных, такая как удаление смайликов, косых черт, тире, цифр, а в нашем случае - удаление латинских букв, и для этого , мы использовали :

‘re’ Операции с регулярными выражениями, как показано в его документации.

Использование Doccano для маркировки данных:

Мы пытались использовать программное обеспечение Doccano для маркировки наборов данных, извлеченных из Интернета, но оно оказалось не столь точным при решении проблем с согласованностью.

После процесса превратностей мы успешно получили извлеченный набор данных MSA и маркировку в соответствии с требованиями.

Библиотека Яруба PyPI

Мы разработали один код на Python, состоящий из нескольких функций для реализованной нами библиотеки Yarub. Теперь мы можем загружать, извлекать и загружать наборы обучающих данных с помощью библиотеки «Yarub».

import io
import os
import struct
import zipfile

import requests
def load_sentiment():
    if not os.path.exists("Sentiment_Analysis/"):
        os.mkdir("Sentiment_Analysis/")
    print("[INFO] Downloading")
    url = r"https://github.com/messi313/Omdena-Dataset/raw/main/Omdena-seniment-analysis-Datasets.zip"
    r = requests.get(url)
    local_filename = "Sentiment_Analysis/Omdena-seniment-analysis-Datasets.zip"
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            f.write(r.content)
    print("[INFO] Extracting")
    z = zipfile.ZipFile("Sentiment_Analysis/Omdena-seniment-analysis-Datasets.zip")
    z.extractall("Sentiment_Analysis/")
    print("[INFO] Done")
    #os.remove("Sentiment_Analysis/Omdena-seniment-analysis-Datasets.zip")

def load_ner():
    if not os.path.exists("Entity_Recognition/"):
        os.mkdir("Entity_Recognition/")
    print("[INFO] Downloading")
    url = r"https://github.com/messi313/Omdena-Dataset/raw/main/NER_data_spacy.json"
    r = requests.get(url)
    local_filename = "Entity_Recognition/NER_data_spacy.json"
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            f.write(r.content)
    print("[INFO] Done")

def load_dialect():
    if not os.path.exists("dialect/"):
        os.mkdir("dialect/")
    print("[INFO] Downloading")
    url = r"https://github.com/messi313/Omdena-Dataset/raw/main/Final_Dialect_Dataset.zip"
    r = requests.get(url)
    local_filename = r"dialect/Final_Dialect_Dataset.zip"
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            f.write(r.content)
    print("[INFO] Extracting")
    z = zipfile.ZipFile("dialect/Final_Dialect_Dataset.zip")
    z.extractall("dialect/")
    #os.remove("dialect/Final_Dialect_Dataset.zip")
    print("[INFO] Done")
def load_word_embedding():
    if not os.path.exists("Word_Embedding/"):
        os.mkdir("Word_Embedding/")
    print("[INFO] Downloading")
    url = r"https://github.com/messi313/Omdena-Dataset/raw/main/Word%20Embedding.zip"
    r = requests.get(url)
    local_filename = r"Word_Embedding/Word Embedding.zip"
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            f.write(r.content)
    print("[INFO] Extracting")
    z = zipfile.ZipFile("Word_Embedding/Word Embedding.zip")
    z.extractall("Word_Embedding/")
    #os.remove("Word_Embedding/Word Embedding.zip")
    print("[INFO] Done")

def load_pos():
    if not os.path.exists("Parts_of_speech/"):
        os.mkdir("Parts_of_speech/")
    print("[INFO] Downloading")
    url = r"https://github.com/messi313/Omdena-Dataset/raw/main/Final_Pos.zip"
    r = requests.get(url)
    local_filename = r"Parts_of_speech/Final_Pos.zip"
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            f.write(r.content)
    print("[INFO] Extracting")
    z = zipfile.ZipFile("Parts_of_speech/Final_Pos.zip")
    z.extractall("Parts_of_speech/")
    #os.remove("Parts_of_speech/pos_data.zip")
    print("[INFO] Done")

def load_morphology():
    if not os.path.exists("Morphology/"):
        os.mkdir("Morphology/")
    print("[INFO] Downloading")
    url = r"https://github.com/messi313/Omdena-Dataset/raw/main/final_morpho_data.zip"
    r = requests.get(url)
    local_filename = r"Morphology/final_morpho_data.zip"
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            f.write(r.content)
    print("[INFO] Extracting")
    z = zipfile.ZipFile("Morphology/final_morpho_data.zip")
    z.extractall("Morphology/")
    #os.remove("Morphology/final_morpho_data.zip")
    print("[INFO] Done")

Чаще всего размещается на Python Packaging Index (PyPI), исторически известном как Cheese Shop. В PyPI вы можете найти все, от Hello World до расширенных библиотек глубокого обучения.

Здесь вы можете узнать о нашей библиотеке PyPI Yarub.

Заключение

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

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

В конце наслаждайтесь этим видео, которое отправит вас в небольшое путешествие по нашему проекту.

Эта статья первоначально появилась в блоге Омдены.