[PYTHON] 100 Language Processing Knock-82 (mot de contexte): Extraction de contexte

Il s'agit de l'enregistrement de la 82ème "extraction de contexte" de Language processing 100 knock 2015. Cette fois également, le système de prétraitement pour le processus suivant n'a pas effectué de traitement particulièrement difficile, et techniquement il y a peu d'explications. Cependant, l'énoncé du problème était difficile à comprendre pour un amateur et il lui a fallu un certain temps pour le comprendre.

Lien de référence

Lien Remarques
082.Extraction de contexte.ipynb Lien GitHub du programme de réponse
100 coups de traitement du langage amateur:82 Je vous suis toujours redevable de 100 coups de traitement linguistique
100 langues de traitement knock version 2015(80~82) J'y ai fait référence au chapitre 9.

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

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é.

82. Extraction du contexte

Exportez toutes les paires de mot $ t $ et de mot contextuel $ c $ au format délimité par des tabulations pour tous les mots t qui apparaissent dans le corpus créé en> 81. Cependant, la définition des mots contextuels est la suivante.

-Extraire $ d $ mots avant et après un mot $ t $ comme mot de contexte $ c $ (cependant, le mot de contexte n'inclut pas le mot t lui-même) -À chaque fois que vous sélectionnez le mot $ t $, la largeur du contexte $ d $ est déterminée aléatoirement dans l'intervalle {1,2,3,4,5}.

Supplément de problème

Qu'est-ce qu'un «mot contextuel»?

Le mot cible est appelé ** "Mot cible" **, et les mots avant et après le mot cible sont appelés ** "Mot de contexte" **. Le nombre de mots entre le mot cible et le mot de contexte est appelé ** «Taille de la fenêtre contextuelle» (Taille de la fenêtre contextuelle ou Taille de la fenêtre) **.

J'expliquerai avec la phrase d'exemple suivante dans le fichier original de la mission.

No surface details of Adrastea are known due to the low resolution of available images

Par exemple, si * Adrastea * est le mot cible ci-dessus, les «détails», «de», «sont» et «connus» sont des mots de contexte avec une largeur de contexte de 2. Donc, si vous souhaitez exécuter cette tâche pour la phrase ci-dessus avec une largeur de contexte de 2, créez cette fois le fichier suivant.

1 nom de colonne 2e rangée
No surface
No details
surface No
surface details
surface of
details No
details surface
details of
details Adrastea

Répondre

Programme de réponse [082. Extraction de contexte.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) / 082.% E6% 96% 87% E8% 84% 88% E3% 81% AE% E6 % 8A% BD% E5% 87% BA.ipynb)

Bien qu'il s'agisse d'un programme court d'environ 20 lignes, son traitement prend environ 10 minutes en raison de la grande quantité de données. Veuillez également noter que le fichier créé est d'environ 800 Mo de taille et de grande taille. Soit dit en passant, plus de 90% sont des copies de Article "Traitement du langage amateur 100 coups: 82".

import random

with open('./081.corpus.txt') as file_in, \
     open('./082.context.txt', mode='w') as file_out:
    for i, line in enumerate(file_in):
        tokens = line.strip.split(' ')
        for j in range(len(tokens)):
            d = random.randint(1, 5)        #Largeur du contexte d
            
            #Énumération des mots entre d avant et après
            for k in range(max(j - d, 0), min(j + d + 1, len(tokens))):
                
                #Ne sortez pas pour vous-même
                if j != k:
                    file_out.writelines(tokens[j]+'\t'+tokens[k]+'\n')
        if i < 4:
            print(len(tokens), tokens)
        else:
            print('\r Processding line: {0}'.format(i), end='')

Répondre au commentaire

Le code ci-dessous est la partie principale. C'est une boucle du nombre qui augmente ou diminue la largeur du contexte «d» à partir de l'emplacement «j» du mot cible. Cependant, si vous l'augmentez ou le diminuez simplement, le premier mot sera un nombre négatif et le dernier mot dépassera le nombre total de mots, utilisez donc les fonctions «max» et «min» pour élargir la largeur. Je fais des ajustements.

#Énumération des mots entre d avant et après
for k in range(max(j - d, 0), min(j + d + 1, len(tokens))):
                
    #Ne sortez pas pour vous-même
    if j != k:
        file_out.writelines(tokens[j]+'\t'+tokens[k]+'\n')

Jusqu'à la 4ème ligne, le nombre de mots cibles et la phrase cible de traitement sont sortis vers la console, et après cela, le nombre de lignes traitées est sorti.

if i < 4:
    print(len(tokens), tokens)
else:
    print('\r Processding line: {0}'.format(i), end='')

Déversement (échec de la création de jetons)

C'est une histoire d'échec sur la tokenisation de phrases. Au début, j'ai utilisé la fonction split comme indiqué ci-dessous sans trop réfléchir.

tokens = line.split()

Cependant, certains des résultats étaient comme ça, et j'ai remarqué une erreur lorsque j'ai utilisé Pandas plus tard.

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

Ça aurait dû être comme ça. À première vue, il semble qu'il est séparé par des espaces, et «\ xa0» est utilisé pour les parties en forme d'espace. À propos de \ xa0 de l'article précédent Touche un peu.

known	k" = √("s"("s" − "a")("s" − "b")("s" − "c

Donc, pour le rendre correct, j'ai utilisé la fonction strip pour le séparer avec juste un espace.

tokens = line.strip.split(' ')

Recommended Posts

100 Language Processing Knock-82 (mot de contexte): Extraction de contexte
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
100 coups de traitement linguistique (2020): 28
Traitement du langage 100 knock-86: affichage vectoriel Word
100 Language Processing Knock-83 (en utilisant des pandas): Mesure de la fréquence des mots / contextes
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 Language Processing Knock-84 (en utilisant des pandas): Création d'une matrice de contexte de mots
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 Traitement du langage Knock-52: Stemming
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
Traitement du langage 100 knocks-45: Extraction de modèles de cas verbaux
100 traitement du langage knock-72 (en utilisant Stanford NLP): Extraction d'identité
100 coups de traitement du langage avec Python 2015
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
J'ai essayé 100 traitements linguistiques Knock 2020
100 Language Processing Knock-56: analyse de co-référence
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
Traitement du langage naturel 2 similitude de mots
100 coups de traitement du langage amateur: Résumé
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
[Traitement du langage 100 coups 2020] Chapitre 7: Vecteur Word
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
100 Language Processing Knock-28: Suppression du balisage MediaWiki
100 Language Processing Knock 2020 Chapitre 8: Neural Net
100 traitement du langage knock-59: analyse de la formule S
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
100 traitement du langage knock-31 (en utilisant des pandas): verbe
100 langues de traitement frappent 2020 "pour Google Colaboratory"