[PYTHON] Prétraitement des données texte (vectorisation, TF-IDF)

Vectorisation de texte

Pour appliquer un algorithme d'apprentissage automatique aux données textuelles, il est nécessaire de convertir les données brutes, qui sont une liste de mots, en un vecteur de caractéristiques numériques.

Sac de mots: l'idée d'ignorer la grammaire et l'ordre des mots et de traiter les phrases comme un ensemble de mots.

Ici, une bibliothèque de modèles de sujets appelée gensim est utilisée. Utilisez un court corpus de 9 phrases pour vous entraîner comme décrit dans le tutoriel officiel.

from gensim import corpora

documents = ["Human machine interface for lab abc computer applications",
             "A survey of user opinion of computer system response time",
             "The EPS user interface management system",
             "System and human system engineering testing of EPS",              
             "Relation of user perceived response time to error measurement",
             "The generation of random binary unordered trees",
             "The intersection graph of paths in trees",
             "Graph minors IV Widths of trees and well quasi ordering",
             "Graph minors A survey"]

Les mots courants tels que a, le, pour, de et n'ont pas de sens dans Sac-de-mots, ils sont donc exclus comme mots vides. De plus, afin d'éliminer l'influence du flou de notation et la présence de mots au début des phrases, tous sont convertis en minuscules.

# remove common words and tokenize
stoplist = set('for a of the and to in'.split())
texts = [[word for word in document.lower().split() if word not in stoplist]
         for document in documents]

Les mots qui n'apparaissent qu'une seule fois dans le corpus ne contiennent pas beaucoup d'informations, ils sont donc exclus.

# remove words that appear only once
from collections import defaultdict
frequency = defaultdict(int)
for text in texts:
    for token in text:
        frequency[token] += 1

texts = [[token for token in text if frequency[token] > 1] for text in texts]

from pprint import pprint  # pretty-printer
pprint(texts)

Voici les résultats.

[['human', 'interface', 'computer'],
 ['survey', 'user', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'system'],
 ['system', 'human', 'system', 'eps'],
 ['user', 'response', 'time'],
 ['trees'],
 ['graph', 'trees'],
 ['graph', 'minors', 'trees'],
 ['graph', 'minors', 'survey']]

Jusqu'à ce point, le mot a été divisé en blancs et symbolisé. Ensuite, donnez un identifiant à chaque mot et comptez le nombre d'occurrences (count). gensim.corpora.dictionary.Dictionary est un dictionnaire qui représente le mappage entre les jetons et les identifiants.

dictionary = corpora.Dictionary(texts)

print(dictionary)
print(dictionary.token2id)
Dictionary(12 unique tokens: ['human', 'interface', 'computer', 'survey', 'user']...)
{'human': 0, 'interface': 1, 'computer': 2, 'survey': 3, 
'user': 4, 'system': 5, 'response': 6, 'time': 7, 
'eps': 8, 'trees': 9, 'graph': 10, 'minors': 11}

Il y a 12 mots uniques dans le corpus. Chaque phrase est représentée par un vecteur à 12 dimensions contenant le décompte de chaque mot. Utilisez doc2bow pour vectoriser le nouveau texte.

new_doc = "Human computer interaction"
new_vec = dictionary.doc2bow(new_doc.lower().split())
print(new_vec)  # the word "interaction" does not appear in the dictionary and is ignored
[(0, 1), (2, 1)]

Le résultat est renvoyé sous la forme [(word_id, word_count), ...]. Dans ce cas, un humain avec id = 0 et une interaction avec id = 2 sont inclus. Les mots avec 0 occurrence sont ignorés. De plus, «interaction» n'est pas incluse dans le dictionnaire et est ignorée.

Vectorisez le texte original.

corpus = [dictionary.doc2bow(text) for text in texts]
for c in corpus:
    print(c)
[(0, 1), (1, 1), (2, 1)]
[(2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)]
[(1, 1), (4, 1), (5, 1), (8, 1)]
[(0, 1), (5, 2), (8, 1)]
[(4, 1), (6, 1), (7, 1)]
[(9, 1)]
[(9, 1), (10, 1)]
[(9, 1), (10, 1), (11, 1)]
[(3, 1), (10, 1), (11, 1)]

TF-IDF

le terme sens
TF (term frequency) Fréquence d'occurrence des mots
IDF (inverse document frequency) Inverser la fréquence d'apparition des documents

Les mots qui apparaissent extrêmement souvent dans le corpus peuvent ne pas contenir d'informations très utiles. Le fait de donner des données de comptage de mots (TF) directement au classificateur a pour résultat que des mots moins fréquents mais plus significatifs sont enfouis dans ces mots. Par conséquent, en plus de TF, le montant des caractéristiques est pondéré par IDF.

La FID est définie comme suit. $ n_d $ est le nombre total de documents, $ df (d, t) $ est le nombre de documents contenant le mot t. Moins il y a de documents contenant le mot t, plus l'IDF est grand (ce qui augmente le poids des mots rares).

idf(t)=log\frac{1+n_d}{1+df(d,t)}+1

Convertissez par TF-IDF avec gensim.

from gensim import models
# step 1 -- initialize a model
tfidf = models.TfidfModel(corpus)

# step 2 -- use the model to transform vectors
corpus_tfidf = tfidf[corpus]
for doc in corpus_tfidf:
    print(doc)
[(1, 0.5710059809418182), (4, 0.4170757362022777), (5, 0.4170757362022777), (8, 0.5710059809418182)]
[(0, 0.49182558987264147), (5, 0.7184811607083769), (8, 0.49182558987264147)]
[(4, 0.45889394536615247), (6, 0.6282580468670046), (7, 0.6282580468670046)]
[(9, 1.0)]
[(9, 0.7071067811865475), (10, 0.7071067811865475)]
[(9, 0.5080429008916749), (10, 0.5080429008916749), (11, 0.695546419520037)]
[(3, 0.6282580468670046), (10, 0.45889394536615247), (11, 0.6282580468670046)]

Ici, le corpus lui-même utilisé pour l'entraînement a été converti par TF-IDF, mais bien sûr tout vecteur de phrase peut être converti (tant qu'il appartient au même espace vectoriel).

Recommended Posts

Prétraitement des données texte (vectorisation, TF-IDF)
Corrélation par prétraitement des données
Pré-traitement des données préfectorales
Sélectionnez des fonctionnalités avec des données textuelles
[Français] scicit-learn 0.18 Tutorial Manipulation des données de texte
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Notes personnelles de prétraitement des données Python Pandas
Modèle de prétraitement pour l'analyse des données (Python)
Prétraitement dans l'apprentissage automatique 2 Acquisition de données
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
[Français] scikit-learn 0.18 Guide de l'utilisateur 4.3. Prétraitement des données
Prétraitement dans l'apprentissage automatique 4 Conversion de données