Implemetanacja Pandas DataFrame Dataset w TorchText

Dziś techniczny wpis o tym, jak podawać dane do sieci w Pytorch przy pomocy Pandas DataFrame z wykorzystaniem biblioteki TorchText. W chwili pisania TorchText nie ma możliwości pobierania danych wprost z Pandas. Obsługuje szereg typów plików oraz gotowych zbiorów, ale zakładam, że większość z nas i tak na wstępnym etapie przetwarza dane przy pomocy Pandas.

Jeżeli nie znacie jeszcze TorchText to zapraszam do wpisu “Przetwarzasz teksty, robisz NLP, TorchText Ci pomoże!” . Omówiłem w nim idee pracy z TorchText oraz na własnych doświadczeniach opisałem w czym może ona pomóc.

Skąd TorchText pobiera dane

Biblioteka TrochText ma za zadanie pomagać w wczytywaniu i przetwarzaniu danych tekstowych (sekwencyjnych). Zapewnia szereg klas do wczytywania danych z różnych formatów. Klasą bazową służącą do wczytywania danych jest Dataset. Jednak najczęściej wykorzystywaną implementacją jest TabularDataset, która “Defines a Dataset of columns stored in CSV, TSV, or JSON format.” (cytując dokumentację).

W chwili pisania tego artykułu nie ma klasy, która pozwalałaby na wczytanie danych z Pandas DataFrame. A co w tym złego się zapytacie?

A to, że dla mnie ramka z danymi to pierwsze, w czym obrabiam dane. Daje szerokie możliwości wstępnej obróbki oraz wczytywanie z niej danych. Jest także wspierane przez wiele innych bibliotek. Stąd pojawiła się potrzeba, aby ramka była moim źródłem danych i stanowiła część całego procesu od wczytania po trening.

Tego problemu doświadczyli także inni, szybki research i trafiłem na przykładową prostą implementację z stack overflow (https://stackoverflow.com/questions/52602071/dataframe-as-datasource-in-torchtext).

Dataframe jako źródło danych do TorchTexh – implementacja

Implementacja jest dosyć prosta. Należy stworzyć dwie klasy. Pierwsza dziedziczącą po Dataset, a druga dziedzicząca po data.Example. Cała filozofia polega na przemapowaniu listy pól na nazwami kolumn z dataframe (Fields) na pola w klasie Example.

Jak się do tego zabrać? Na początku zdefiniujmy klasę DataFrameDataset.

Do konstruktora tej klasy przekazujemy dwa argumenty. Pandasową ramkę z danymi oraz słownik określający jak poszczególne kolumny z tej ramki mają być przetwarzane (Fields). Następnie w konstruktorze budujemy listę self.examples. Jest to lista przykładów, każdy przykład to jeden wiersz z naszego źródła danych.

Do budowania Example wykorzystamy własną pomocniczą klasę SeriesExample. Z przekazanej serii danych stworzy ona egzemplarze z ustawionymi polami o nazwach przekazanych w liście fields. Zwróćcie uwagę na metody setattr.

Przykład użycia DataframeDataset

Przykład użycia tej klasy, znajdziecie we wpisie tworzącym sieć LSTM do zliczania znaków. Tam bez wyjaśnienia użyłem tej klasy, gdzie wygenerowane dane trafiły do dataframe. Następnie na jego podstawie stworzyłem DataFrameDataset, dzięki czemu można go było użyć w TorchText.

W wielkim skrócie, aby użyć DataFrameDataset musicie wykonać:

Ładujemy nasze dane do ramki, w tym przykładzie powinniśmy mieć w ramce dwie kolumny “text” i “label”. Pierwsza zawierająca w każdym wierszu teksty, a druga etykietę przypisaną do danego tekstu.

Tworzymy dwa pola (Fields) a następnie do konstruktora klasy DataFrameDataset przekazujemy ramkę oraz słownik: “nazwa kolumny z ramki”: odpowiedni Field.

Dalej już możemy postępować standardowo jak przy normalnym użyciu TorchText.

Podsumowanie i materiały

We wpisie pokazałem, w jaki sposób wykorzystać ramkę z Pandas jako źródło danych do TorchText. Jest to wygodny skrót, który pomaga w ujednoliceniu całego procesu czyszczenia danych oraz ich wczytywania.
Z doświadczenia w naszych firmowych komercyjnych projektach mogę powiedzieć, że sprawdził się bardzo dobrze.

Można go jeszcze rozszerzyć o to, aby dane nie pochodziły z samej ramki a z Python’owego generatora. Spowoduje to, że nie będziecie musieli martwić się o wielkość danych i zasoby RAM’u przy gigantycznych zbiorach tekstowych.

PS. Zostaw swojego maila a dostaniesz informacje o nowych artykułach i planowanych przez mnie kursach.

Photo by Alex Hiller on Unsplash

Dodaj komentarz

This site uses Akismet to reduce spam. Learn how your comment data is processed.