Il s'agit de l'enregistrement des 81e «Contre-mesures constituées de mots composés» dans Language Processing 100 Knock 2015. Cette fois également, suite à la précédente «mise en forme du corpus» (https://qiita.com/FukuharaYohei/items/56a5a34ab8417baead76), le système de prétraitement est utilisé, et le traitement principal est le remplacement de caractères à l'aide d'expressions régulières. Cependant, je fais le travail pénible manuellement dans la partie de faire la liste de noms de pays. Pour cette raison, la programmation en elle-même n'est pas difficile, mais cela a pris du temps.
Lien | Remarques |
---|---|
081.Traitement des noms de pays composés de mots composés.ipynb | Lien GitHub du programme de réponse |
100 coups de traitement du langage amateur:81 | Je vous suis toujours redevable de 100 coups de traitement linguistique |
100 langues de traitement knock version 2015(80~82) | Le chapitre 9 a été utile |
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é.
En anglais, la concaténation de plusieurs mots peut avoir du sens. Par exemple, les États-Unis sont exprimés en "États-Unis" et le Royaume-Uni en "Royaume-Uni", mais les mots "États-Unis", "États" et "Royaume" seuls sont ambigus dans le concept ou la substance qu'ils désignent. Par conséquent, nous aimerions estimer la signification du mot composé en reconnaissant le mot composé contenu dans le corpus et en traitant le mot composé comme un mot. Cependant, il est très difficile d'identifier avec précision les mots composés, c'est pourquoi nous souhaitons ici identifier un nom de pays composé de mots composés.
Obtenez votre propre liste de noms de pays sur Internet et remplacez les espaces par des traits de soulignement pour les noms de pays des mots composés qui apparaissent dans les 80 corpus. Par exemple, «États-Unis» devrait être «États-Unis» et «Île de Man» devrait être «Isle_of_Man».
Il est difficile de "récupérer la liste des noms de pays par vous-même sur Internet" ...
Je pensais que la page "Country codes / names" serait bonne, mais "Isle of" dans l'énoncé du problème Il n'y a pas d'homme ". «L'île de Man» semble être dans l'ISO 3166-1, donc [l'ISO 3166-1 de Wikipedia] J'ai obtenu la liste sur (https://en.wikipedia.org/wiki/ISO_3166-1). En d'autres termes, nous créons une liste de noms de pays à partir des trois suivants.
Certains noms obtenus à partir de la colonne ʻOfficial namede ["Country codes / names"](http://www.fao.org/countryprofiles/iso3list/en/) sont préfixés par
the`. Je l'ai enlevé plus tard car c'était un obstacle.
Depuis que je l'ai obtenu à partir de trois, certains noms de pays sont dupliqués, j'ai donc supprimé les doublons.
Le thème cette fois est "Nom de pays composé de mots composés", et un seul mot de nom de pays n'est pas nécessaire. J'ai fait = COUNTIF (A1," * * ")
sur EXCEL et j'ai jugé le nom du pays avec un espace entre les deux en tant que mot composé, et j'ai supprimé le nom du pays dont le résultat de la fonction EXCEL était 0.
Certains d'entre eux ne peuvent pas être utilisés tels quels, j'ai donc effectué des ajustements précis manuellement. Ça prend du temps ... Ce qui suit est un exemple.
Ancien | Après le changement |
---|---|
Bolivia (Plurinational State of) | Plurinational State of Bolivia |
Cocos (Keeling) Islands | Cocos Keeling Islands Cocos Keeling Cocos Islands Keeling Islands |
Au final, 247 noms de pays ont été créés.
C'est un programme. Le processus est court et trivial (je passe quelques heures à le faire par manque de compétences ...).
Cependant, il faut environ 12 minutes pour effectuer une recherche en texte intégral et remplacer jusqu'à 247 noms de pays. Article "100 coups de traitement du langage version 2015 (80-82)" C'est plus rapide si vous utilisez la commande sed
N'est-ce pas?
import re
#Supprimer le code de saut de ligne du fichier et le numéro de mot du préfixe pour le tri
with open('./081.countries.txt') as countires:
country_num = [[len(country.split()), country.rstrip('\n')] for country in countires]
country_num.sort(reverse=True)
with open('./080.corpus.txt') as file_in:
body = file_in.read()
for i, country in enumerate(country_num):
print(i, country[1])
regex = re.compile(country[1], re.IGNORECASE)
body = regex.sub(country[1].replace(' ', '_'), body)
with open('./081.corpus.txt', mode='w') as file_out:
file_out.write(body)
Le fichier de la liste des noms de pays est lu, le nombre de mots est ajouté à la liste et il est trié par ordre décroissant. Cela est dû au fait que "États-Unis d'Amérique" est remplacé par "États-Unis", qui contient un plus petit nombre de mots, et non par "États-Unis d'Amérique".
#Supprimer le code de saut de ligne du fichier et le numéro de mot du préfixe pour le tri
with open('./081.countries.txt') as countires:
country_num = [[len(country.split()), country.rstrip('\n')] for country in countires]
country_num.sort(reverse=True)
En définissant re.INGNORECASE
dans l'expression régulière, il est remplacé sans faire la distinction entre les majuscules et les minuscules (je n'ai pas confirmé si cette fluctuation est utile).
regex = re.compile(country[1], re.IGNORECASE)