Ekstrakcja danych – tokenizacja tekstu – PHP-ML
|Analiza tekstu jest jednym z głównych poligonów dla zastosowań algorytmów uczenia maszynowego. Jednak surowe dane tekstowe (czyli sekwencja symboli) nie mogą być poddawane bezpośrednio pod działanie algorytmów jak większość liczbowych wektorów o stałej wielkości.
W celu łatwiejszego dokonywania analizy danych tekstowych w bibliotece PHP-ML powstała klasa TokenCountVectorizer. Jej zadaniem jest zamiana treści na tokeny, a następnie zliczenie ich ilości. W efekcie na wyjściu otrzymamy macierz z ilościami wystąpień tokenów.
Parametry konstruktora klasy TokenCountVectorizer:
- $tokenizer (Tokenizer) – obiekt tokenizatora (implementuje interfejs Tokenizer, opis poniżej)
- $minDF (float) – ignoruj tokeny których ilość wystąpień w cały zbiorze jest niższa niż zadany próg (tzw. cut-off, domyślnie 0)
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WhitespaceTokenizer;
$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());
Transformacja danych wejściowych
W celu transformacji danych wejściowych używamy metody transform(). Przykład:
$samples = [
'Lorem ipsum dolor sit amet dolor',
'Mauris placerat ipsum dolor',
'Mauris diam eros fringilla diam',
];
$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());
$samples = $vectorizer->transform($samples);
Na wyjściu otrzymamy tablicę z wyliczonymi tokenami:
$samples = [
[0 => 1, 1 => 1, 2 => 2, 3 => 1, 4 => 1],
[5 => 1, 6 => 1, 1 => 1, 2 => 1],
[5 => 1, 7 => 2, 8 => 1, 9 => 1],
];
Klucze poszczególnych tablic to indeksy tokenów, a wartości to liczba ich wystąpień w danej próbce.
Słownik
Otrzymane dane wyjściowe mogą okazać się kłopotliwe w interpretacji. Tokeny są symbolizowane przez wartości numeryczne. Aby dokonać przekształcenia lub analizy możemy skorzystać z metody getVocabulary():
$vocabulary = $vectorizer->getVocabulary();
// $vocabulary = ['Lorem', 'ipsum', 'dolor', 'sit', 'amet', 'Mauris', 'placerat', 'diam', 'eros', 'fringilla'];
Tokenizatory
Na chwilę obecną zaimplementowane zostały dwie klasy tokenizatorów:
- WhitespaceTokenizer – separatorem poszczególnych tokenów są białe znaki
- WordTokenizer – tokenem staje się słowo mające co najmniej dwa znaki alfanumeryczne (punkcja jest kompletnie ignorowana i traktowana zawsze jako separator)
Przykładowe użycie samego tokenizatora:
use Phpml\Tokenization\WordTokenizer;
$text = 'Lorem ipsum-dolor sit amet, consectetur/adipiscing elit.
Cras consectetur, dui et lobortis;auctor.
Nulla vitae ,.,/ congue lorem.';
$tokenizer = new WordTokenizer();
$tokens = $tokenizer->tokenize($text);
W ten sposób na wyjściu otrzymamy:
$tokens = [
'Lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit',
'Cras', 'consectetur', 'dui', 'et', 'lobortis', 'auctor',
'Nulla', 'vitae', 'congue', 'lorem'
];