[PYTHON] 100 Language Processing Knock-83 (en utilisant des pandas): Mesure de la fréquence des mots / contextes

Il s'agit de l'enregistrement de la 83e «Mesure de la fréquence des mots / contextes» de Traitement du langage 100 knock 2015. Cela prend du temps (environ 7 minutes) car il s'agit d'un processus pour un fichier d'environ 800 Mo. Je pensais qu'une erreur de mémoire se produirait si je les lisais tous en même temps, et quand j'essayais de survivre en utilisant l'option chunksize des pandas, j'ai eu du mal car je ne pouvais pas du tout le faire. Après tout, il pouvait être lu en une seule fois et il n'y avait aucun problème particulier.

Lien de référence

Lien Remarques
083.Mesure de fréquence de mots / contextes.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:83 Je vous suis toujours redevable de 100 coups de traitement linguistique
100 langues de traitement knock version 2015(83,84) J'y ai fait référence au chapitre 9.
Comment utiliser Pandas groupby Facile à comprendre comment utiliser le groupe pandas par
to_fonction pickle to_fonction pickleの公式ヘルプ

environnement

type version Contenu
OS Ubuntu18.04.01 LTS Il fonctionne virtuellement
pyenv 1.2.15 J'utilise pyenv car j'utilise parfois plusieurs environnements Python
Python 3.6.9 python3 sur pyenv.6.J'utilise 9
3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8
Les packages sont gérés à l'aide de venv

Dans l'environnement ci-dessus, j'utilise les packages Python supplémentaires suivants. Installez simplement avec pip ordinaire.

type version
pandas 0.25.3

Tâche

Chapitre 9: Méthode de l'espace vectoriel (I)

enwiki-20150112-400-r10-105752.txt.bz2 Le texte de 105 752 articles est-il échantillonné au hasard au 1/10 des articles composés d'environ 400 mots ou plus parmi les articles de Wikipedia anglais au 12 janvier 2015, compressé au format bzip2. y a-t-il. En utilisant ce texte comme corpus, je souhaite apprendre un vecteur (expression distribuée) qui exprime le sens d'un mot. Dans la première moitié du chapitre 9, le processus d'apprentissage du vecteur de mot est mis en œuvre en le divisant en plusieurs processus en appliquant l'analyse en composantes principales à la matrice de cooccurrence de contexte de mot créée à partir du corpus. Dans la seconde moitié du chapitre 9, le vecteur de mots (300 dimensions) obtenu par apprentissage est utilisé pour calculer la similitude des mots et analyser (analogique).

Notez que si le problème 83 est implémenté de manière obéissante, une grande quantité (environ 7 Go) de stockage principal sera nécessaire. Si vous manquez de mémoire, concevez un processus ou un corpus d'échantillonnage 1/100 enwiki-20150112-400-r100-10576.txt.bz2 Utilisez /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).

Cette fois * "Corpus d'échantillonnage 1/100 [enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-" 400-r100-10576.txt.bz2) "* est utilisé.

83. Mesure de la fréquence des mots / contextes

Utilisez la sortie> 82 pour trouver la distribution d'apparence et les constantes suivantes.

  • $ f (t, c) $: Nombre de co-occurrence du mot $ t $ et du mot de contexte $ c $
  • $ f (t, ∗) $: Nombre d'occurrences du mot $ t $
  • $ f (∗, c) $: Nombre d'occurrences du mot de contexte $ c $
  • $ N $: Nombre total d'occurrences de paires mot / mot contextuel

Supplément de problème

"Word $ t $" est [article précédent](https://qiita.com/FukuharaYohei/items/64e20ced30cba76383dc#%E6%96%87%E8%84%88%E8%AA%9E%E3%81% Il s'agit du ** "Mot cible" ** écrit en A8% E3% 81% AF). Supposons que la sortie de 82 soit la suivante.

t(Langue cible) c(Mots contextuels)
t1 c1
t1 c2
t2 c1
t1 c1

Ensuite, ce qui suit est sorti. Ce que l'on appelle SQL Group By.

** $ f (t, c) $: Nombre de co-occurrence du mot $ t $ et du mot de contexte $ c $ **

t(Langue cible) c(Mots contextuels) Nombre de cooccurrence
t1 c1 2
t1 c2 1
t2 c1 1

** $ f (t, ∗) $: Nombre d'occurrences du mot $ t $ **

t(Langue cible) Nombre d'apparitions
t1 3
t2 1

** $ f (∗, c) $: Nombre d'occurrences du mot de contexte $ c $ **

c(Mots contextuels) Nombre d'apparitions
c1 3
c2 1

** $ N $: nombre total d'occurrences de paires de mots / mots contextuels ** 4 (car le tout fait 4 lignes)

Répondre

Programme de réponse [083. Mesure de la fréquence des mots / contextes.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/09.%E3%83%99%E3%82%AF%E3%83 % 88% E3% 83% AB% E7% A9% BA% E9% 96% 93% E6% B3% 95% 20 (I) / 083.% 20% E5% 8D% 98% E8% AA% 9E% EF % BC% 8F% E6% 96% 87% E8% 84% 88% E3% 81% AE% E9% A0% BB% E5% BA% A6% E3% 81% AE% E8% A8% 88% E6% B8 % AC.ipynb)

import sys

import pandas as pd

df = pd.read_table('./082.context.txt', header=None, names=['t', 'c'])
print(df.info())

def to_pickle_file(grouped, path):
    print('length:', grouped.size)
    grouped.to_pickle(path)

to_pickle_file(df.groupby(['t','c'])['c'].agg('count'), './083_group_tc.zip')
to_pickle_file(df.groupby('t')['c'].agg('count'), './083_group_t.zip')
to_pickle_file(df.groupby('c')['c'].agg('count'), './083_group_c.zip')

Répondre au commentaire

J'utilise des pandas pour charger un fichier c avec le nom de colonne t.

df = pd.read_table('./082.context.txt', header=None, names=['t', 'c'])
print(df.info())

Comme résultat de df.info (), ce qui suit est sorti, et vous pouvez voir que le résultat de * "$ N $: Nombre total d'occurrences de la paire mot / mot contextuel" * est 6800317. Vous pouvez également voir qu'il utilise environ 1 Go de mémoire. À propos, il a fallu environ 1,5 minute pour la partie lue.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 68000317 entries, 0 to 68000316
Data columns (total 2 columns):
t    object
c    object
dtypes: object(2)
memory usage: 1.0+ GB
None

Ici, le décompte du résultat «groupby» des pandas est enregistré par «pickle». Si vous définissez l'extension de fichier sur zip, il sera automatiquement compressé, ce qui est pratique. Si vous chargez le fichier enregistré ici, vous pouvez le restaurer sous le même objet de la série pandas que lorsque vous l'avez enregistré.

def to_pickle_file(grouped, path):
    print('length:', grouped.size)
    grouped.to_pickle(path)

C'est la partie principale de ce temps. Le regroupement se fait en utilisant «groupby» de pandas et le résultat est compté.

to_pickle_file(df.groupby(['t','c'])['c'].agg('count'), './083_group_tc.zip')
to_pickle_file(df.groupby('t')['c'].agg('count'), './083_group_t.zip')
to_pickle_file(df.groupby('c')['c'].agg('count'), './083_group_c.zip')

À propos, voici les informations de chaque processus.

Nombre de lignes temps de traitement taille du fichier
$ f(t,c) $ 21,327,Ligne 945 4min 38s 103.7MB
$ f(t,*) $ 388,Ligne 836 34.7s 2.8MB
$ f(*,c) $ 388,Ligne 836 24.2s 2.8MB

Astuces / Système de dépannage

Conseils: réduire les fichiers

La taille du fichier cible étant importante (environ 800 Mo), les essais et erreurs ont été très difficiles. Par conséquent, dans un premier temps, j'ai créé et codé un fichier qui ne couvrait que les 100 000 premières lignes.

cat 082.context.txt | head -n 100000 >> 082.context_mini.txt

Sortie de lignes spécifiques dans de gros fichiers

Lorsqu'il y avait une erreur sur la ligne XX dans DataFrame, j'ai combiné head et tail pour voir le contenu du fichier. Normalement, j'ouvre simplement le fichier, mais pour les gros fichiers, il faut du temps pour s'ouvrir, alors je l'ai fait. La commande suivante affiche les lignes 12198 à 3 du fichier. En passant, cette erreur est un échec lié à la tokenisation de la phrase écrite dans "Spill" dans l'article précédent.

$ cat 082.context.txt | head -n 124150 | tail -n 3

"b")("s"	"c
−	"b")("s"
−	"c

Recommended Posts

100 Language Processing Knock-83 (en utilisant des pandas): Mesure de la fréquence des mots / contextes
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
100 Language Processing Knock-82 (mot de contexte): Extraction de contexte
100 traitement du langage knock-31 (en utilisant des pandas): verbe
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
100 Language Processing Knock-33 (en utilisant des pandas): nom sahen
100 traitement du langage knock-35 (utilisant des pandas): concaténation de nomenclature
100 Language Processing Knock-39 (en utilisant des pandas): la loi de Zipf
100 traitement de langage knock-34 (utilisant des pandas): "B of A"
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement de 100 langues knock-98 (en utilisant des pandas): Clustering par méthode Ward
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
Traitement du langage 100 Knock-87: similitude des mots
100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
Traitement du langage 100 knock-86: affichage vectoriel Word
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 traitement du langage knock-73 (en utilisant scikit-learn): apprentissage
100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction
100 traitement du langage knock-97 (en utilisant scicit-learn): clustering k-means
100 coups de traitement linguistique (2020): 28
100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 traitement du langage knock-93 (en utilisant des pandas): calcul du taux de précision de la tâche d'analogie
100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 Language Processing Knock 2020 Chapitre 1
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock Chapitre 1
100 coups de langue amateur: 07
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
100 traitements linguistiques knock-37 (utilisant des pandas): Top 10 des mots les plus fréquents
100 coups de traitement du langage avec Python 2015
100 Language Processing Knock-58: Extraction de Taple
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
Traitement du langage naturel 3 Continuité des mots
100 Language Processing Knock-25: Extraction de modèles
J'ai essayé 100 traitements linguistiques Knock 2020