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 | 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. |
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 |
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é.
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}.
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 |
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='')
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='')
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