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.
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. ..
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.
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
--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.
Utilisez TfidfVectorizer au lieu de CountVectorizer (BoW).
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.
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 à
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é.
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)
L'idée est de composer BoW avec N caractères comme un groupe de vocabulaire pour des lettres, pas des mots.
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 **.
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)
――La dimension s'agrandit
Les quantités de caractéristiques suivantes peuvent également être ajoutées.
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'>
Imaginez un espace vectoriel bidimensionnel / tridimensionnel d'algèbre linéaire.
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
Ajouts / modifications par rapport au chapitre précédent
~~
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