[PYTHON] Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» --Chapitre 2 Étape 04 Mémo «Extraction de fonctionnalités»

Contenu

Ceci est un mémo pour moi pendant que je lis Introduction aux applications de traitement du langage naturel en 15 étapes. Cette fois, au chapitre 2, étape 04, j'écrirai mes propres points.

Préparation

Aperçu des chapitres

Dans l'agent de dialogue créé jusqu'à présent, les fonctionnalités ont été extraites à l'aide de BoW, mais nous visons à apprendre diverses méthodes d'extraction de fonctionnalités telles que TF-IDF, BM25, N-gram et à convertir les chaînes de caractères en vecteurs de fonctionnalités appropriés. ..

04.1 Sac de mots revisité

La nature du sac de mots

BoW est une vectorisation de la fréquence d'occurrence des mots, et capture dans une certaine mesure la similitude des significations des phrases qui "représentent mon goût", y compris des mots tels que "je" et "j'aime".

D'autre part, comme il n'inclut pas d'informations sur l'ordre des mots, chacun a son propre mérite. Dans les sections 04.2 et 04.3 suivantes, des améliorations sont apportées en tenant compte de la fréquence des mots et de la longueur des phrases de la phrase entière, et en 04.4 et 04.5, des améliorations sont apportées en modifiant la méthode de division des mots.

Le nom «Sac de mots» vient de l'image de briser une phrase en mots, de les jeter dans un sac et de compter le nombre d'entre eux, ignorant l'ordre.

Mot inconnu

Lors de la création d'un dictionnaire avec .fit de CountVectorizer et de la vectorisation .transform, s'il y a des mots que vous souhaitez rencontrer et ignorer lors de la vectorisation, vous pouvez séparer l'ensemble de phrases cible.

04.2 TF-IDF

Problèmes BoW et solutions TF-IDF

--BoW problème: les mots qui caractérisent une phrase et les mots qui ne caractérisent pas une phrase sont traités de la même manière. --Solution TF-IDF: réduire la contribution des mots qui ne caractérisent pas la phrase ―― Les mots qui apparaissent largement dans diverses phrases sont des mots généraux, ils ne sont donc pas importants pour exprimer le sens de chaque phrase.

Calcul de TF-IDF par Scikit-learn

Utilisez TfidfVectorizer au lieu de CountVectorizer (BoW).

Comment calculer TF-IDF

Au final, la valeur est obtenue en multipliant la fréquence de mot TF (TermFrequency) par le nombre inverse de fréquence logarithmique de document IDF (InverseDocumentFrequency). TF-IDF (t, d) = TF (t, d) ・ IDF (t)

--TF: La valeur augmente lorsqu'elle apparaît fréquemment dans le texte --IDF: la valeur devient plus petite lorsqu'elle apparaît dans de nombreuses phrases

04.3 BM25 Il s'agit d'une modification de TF-IDF pour prendre en compte la longueur de la phrase.

04.4 Mot N-gramme

Jusqu'à présent, à la suite de l'écriture dans des mots séparés, un mot était traité comme une dimension, de sorte qu'il peut être considéré comme une méthode de ** mot uni-gramme **. D'autre part, la méthode de traitement de deux mots comme une dimension est appelée ** mot bi-gramme **. Si vous voulez assembler 3 mots, utilisez ** mot tri-gramme ** et assemblez-les sous forme de ** mot N-gramme **.

#Résultat écrit
Tokyo/De/Osaka/À/aller

# uni-gramme est 5 dimensions
1.Tokyo
2.De
3.Osaka
4.À
5.aller

# bi-gramme est 4 dimensions
1.depuis Tokyo
2.Depuis Osaka
3.À Osaka
4.aller à

Choses à considérer

En utilisant le mot N-gramme, il devient possible d'extraire des caractéristiques qui prennent en considération les informations d'ordre des mots que BoW a ignorées dans une certaine mesure. D'autre part, à mesure que vous augmentez ** N, la dimension augmente et la fonctionnalité devient clairsemée, de sorte que les performances de généralisation diminuent **, donc le compromis ci-dessus lors de l'utilisation de N-gramme Besoin d'être considéré.

Utilisation avec BoW et TF-IDF par Scikit-learn

Donnez l'argument ngram_range = (valeur minimale, valeur maximale) au constructeur de CountVectorizer et TfidVectorizer. En donnant la valeur minimale et la valeur maximale, tous les N-grammes dans la plage spécifiée peuvent être transformés en vecteurs de caractéristiques. (Exemple: il est également possible de générer un dictionnaire en utilisant à la fois un gramme et un bi-gramme)

04,5 caractères N-gramme

L'idée est de composer BoW avec N caractères comme un groupe de vocabulaire pour des lettres, pas des mots.

Caractéristiques du caractère N-gramme (points à considérer)

Il est fort contre les fluctuations de notation des mots, et il est également fort contre les mots composés et les mots inconnus car il n'effectue pas d'analyse morphologique (écriture) en premier lieu. D'un autre côté, ** la capacité de distinguer des mots / phrases qui sont similaires aux chaînes de caractères mais qui ont des significations différentes peut être réduite et le nombre de dimensions peut augmenter car il existe de nombreux types de caractères en japonais **.

04.6 Combinaison de plusieurs quantités de caractéristiques

Différentes quantités de caractéristiques peuvent être combinées, tout comme plusieurs N-grammes peuvent être combinés et traités comme un vecteur de caractéristiques avec le mot N-gramme.

#Lors de la combinaison après le calcul de chaque vecteur de caractéristiques
bow1 = bow1_vectorizer.fit_transform(texts)
bow2 = bow2_vectorizer.fit_transform(texts)

feature = spicy.sparse.hstack((bow1, bow2))

# scikit-learn.pipeline.Lors de l'utilisation de Feature Union
combined = FeatureUnion(
  [
    ('bow', word_bow_vectorizer),
    ('char_bigram', char_bigram_vectorizer),
  ])

feature = combined.fit_transform(texts)

Éléments à prendre en compte lors de la connexion de plusieurs quantités d'entités

――La dimension s'agrandit

04.7 Autres fonctionnalités ad hoc

Les quantités de caractéristiques suivantes peuvent également être ajoutées.

Combinaison de fonctionnalités ad hoc avec Scikit-learn

Vérifiez les progrès sur le chemin.

test_sklearn_adhoc_union.py


###Source principale omise

import print

print('# num_sentences - \'Bonjour. Bonsoir.\':')
print([sent for sent in rx_periods.split(texts[0]) if len(sent) > 0])

print('\n# [{} for .. in ..]')
print([{text} for text in texts])

textStats = TextStats()
print('\n# TextStats.fit():' + str(type(textStats.fit(texts))))
fitTransformTextStats = textStats.fit_transform(texts)
print('\n# TextStats.fit_transform():'+ str(type(fitTransformTextStats)))
pprint.pprint(fitTransformTextStats)

dictVectorizer = DictVectorizer()
print('\n# DictVectorizer.fit():' + str(type(dictVectorizer.fit(fitTransformTextStats))))
fitTransformDictVectorizer = dictVectorizer.fit_transform(textStats.transform(texts))
print('\n# DictVectorizer.fit_transform():' + str(type(fitTransformDictVectorizer)))
pprint.pprint(fitTransformDictVectorizer.toarray())

countVectorizer = CountVectorizer(analyzer = 'char', ngram_range = (2, 2))
print('\n# CountVectorizer.fit():' + str(type(countVectorizer.fit(texts))))

Résultat d'exécution


$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python test_sklearn_adhoc_union.py
# num_sentences - 'Bonjour. Bonsoir.':
['Bonjour', 'Bonsoir']

# [{} for .. in ..]
[{'Bonjour. Bonsoir.'}, {'Je veux manger de la viande grillée'}]

# TextStats.fit():<class '__main__.TextStats'>

# TextStats.fit_transform():<class 'list'>
[{'length': 12, 'num_sentences': 2}, {'length': 7, 'num_sentences': 1}]

# DictVectorizer.fit():<class 'sklearn.feature_extraction.dict_vectorizer.DictVectorizer'>

# DictVectorizer.fit_transform():<class 'scipy.sparse.csr.csr_matrix'>
array([[12.,  2.],
       [ 7.,  1.]])

# CountVectorizer.fit():<class 'sklearn.feature_extraction.text.CountVectorizer'>

04.8 Modèle d'espace vectoriel

Imaginez un espace vectoriel bidimensionnel / tridimensionnel d'algèbre linéaire.

Le rôle du classificateur

Dans le cas d'un espace vectoriel tridimensionnel et d'une classification binaire (à quelle classe il appartient), la frontière au moment du jugement est appelée la surface de discrimination / frontière de décision.

--Apprentissage: traitement pour tracer des limites dans l'espace vectoriel pour satisfaire le contenu des données de l'enseignant

04.9 Application à l'agent de dialogue

Ajouts / modifications par rapport au chapitre précédent

  1. Caractéristiques: BoW → TF-IDF
  2. Ajouter le mot N-gramme (uni-gramme, bi-gramme, tri-gramme)
~~

pipeline = Pipeline([
  # ('vectorizer', CountVectorizer(tokenizer = tokenizer),↓
  ('vectorizer', TfidVectorizer(
      tokenizer = tokenizer,
      ngram_range=(1,3))),
~~

Résultat d'exécution


# evaluate_dialogue_agent.Correction du nom du module de chargement de py
from dialogue_agent import DialogueAgent
↓
from dialogue_agent_with_preprocessing_and_tfidf import DialogueAgent

$ docker run -it -v $(pwd):/usr/src/app/ 15step:latest python evaluate_dialogue_agent.py
0.58510638

Recommended Posts

Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» --Chapitre 2 Étape 04 Mémo «Extraction de fonctionnalités»
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» - Chapitre 2 Étape 06 Mémo «Identifiant»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" - Chapitre 2 Étape 02 Mémo "Prétraitement"
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» - Chapitre 2 Étape 07 Mémo «Évaluation»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 4 Etape 14 Mémo "Recherche Hyper Paramètre"
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" - Chapitre 4 Étape 15 Mémo "Collecte de données"
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» - Chapitre 3 Étape 08 Mémo «Introduction aux réseaux de neurones»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 2 Étape 05 Mémo "Conversion de quantité de fonctionnalités"
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" - Chapitre 3 Étape 11 Mémo "Embeddings de mots"
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 3 Étape 12 Mémo "Réseaux de neurones convolutifs"
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» --Chapitre 3 Étape 13 Mémo «Réseaux de neurones récurrents»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 3 Étape 09 Mémo "Identifier par Neural Network"
Essayez le livre «Introduction au développement d'applications de traitement du langage naturel en 15 étapes» --Chapitre 2 Étape 01 Mémo «Créer un agent de dialogue»
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 2 Étape 03 Mémo "Analyse morphologique et écriture écrite"
Essayons le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" --Chapitre 3 Étape 10 Mémo "Détails et amélioration du réseau neuronal"
Essayez le livre "Introduction au développement d'applications de traitement du langage naturel en 15 étapes" -Chapitre 1 Mémo "Connaissances préliminaires avant de commencer les exercices"
[WIP] Pré-traitement des notes dans le traitement du langage naturel
Résumé du début au chapitre 1 de l'introduction aux modèles de conception appris en langage Java
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
[Réunion de changement d'emploi] Essayez de classer les entreprises en traitant le bouche-à-oreille en langage naturel avec word2vec
[Traitement du langage naturel] J'ai essayé de visualiser les sujets d'actualité cette semaine dans la communauté Slack
[Traitement du langage naturel] J'ai essayé de visualiser les remarques de chaque membre de la communauté Slack
[Python] Essayez de classer les boutiques de ramen par traitement du langage naturel
Résumé du chapitre 2 de l'introduction aux modèles de conception appris en langage Java
Chapitre 4 Résumé de l'introduction aux modèles de conception appris en langage Java
Résumé du chapitre 3 de l'introduction aux modèles de conception appris en langage Java
[Introduction à RasPi4] Construction de l'environnement, système de traitement du langage naturel mecab, etc. .. .. ♪
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
100 traitements du langage naturel frappent le chapitre 4 Commentaire
100 Language Processing Knock Chapitre 1 en Python
Essayez Cython dans les plus brefs délais
Se préparer à démarrer le traitement du langage naturel
De l'introduction de l'API GoogleCloudPlatform Natural Language à son utilisation
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]