[PYTHON] 100 langage de traitement knock-81 (remplacement de lot): traitement des noms de pays composés de mots composés

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 de référence

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

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

81. Traitement des noms de pays composés de mots composés

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

Répondre

Création d'une liste de noms de pays

1. Obtenez une liste de noms de pays

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.

  1. `" Codes / noms de pays " Colonne "Nom court"
  2. «Codes / noms de pays»](http://www.fao.org/countryprofiles/iso3list/en/) Colonne Nom officiel`
  3. [「Wikipedia ISO 3166-1」] (https://en.wikipedia.org/wiki/ISO_3166-1) Colonne ʻEnglish short name`

2. Suppression du début du

Certains noms obtenus à partir de la colonne ʻOfficial namede ["Country codes / names"](http://www.fao.org/countryprofiles/iso3list/en/) sont préfixés parthe`. Je l'ai enlevé plus tard car c'était un obstacle.

3. Suppression en double

Depuis que je l'ai obtenu à partir de trois, certains noms de pays sont dupliqués, j'ai donc supprimé les doublons.

4. Supprimer un seul nom

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.

5. Réglage fin manuel

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.

Programme de réponse [081. Traitement des noms de pays composés de mots composés.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) / 081.% E8% A4% 87% E5% 90% 88% E8% AA% 9E% E3% 81% 8B% E3% 82% 89% E3% 81% AA% E3% 82% 8B% E5% 9B% BD% E5% 90% 8D% E3% 81% B8% E3% 81% AE% E5% AF% BE% E5% 87% A6.ipynb)

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)

Répondre au commentaire

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)

Recommended Posts

100 langage de traitement knock-81 (remplacement de lot): traitement des noms de pays composés de mots composés
Traitement du langage 100 knocks-88: 10 mots à haute similitude
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
100 coups de traitement du langage avec Python 2015
100 traitements de langage avec Python
100 traitements de langage avec Python (chapitre 3)
100 traitement du langage knock-59: analyse de la formule S
100 traitement de la langue knock-96 (en utilisant Gensim): Extraction du vecteur lié au nom du pays
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
100 traitement du langage knock-91: Préparation des données d'analogie
Traitement du langage 100 knocks-44: Visualisation des arbres dépendants
100 traitement de langue knock-22: Extraction du nom de la catégorie
100 Language Processing Knock-26: suppression du balisage accentué
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)
100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement du langage 100 knocks-45: Extraction de modèles de cas verbaux
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
Réhabilitation des compétences Python et PNL à partir de «Knock 100 Language Processing 2015» (chapitre 2 deuxième semestre)
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 2 premier semestre)
Traitement du langage 100 knock-80 (remplacé par une expression régulière): formatage du corpus
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
Traitement du langage 100 knocks-49: Extraction de chemins de dépendances entre nomenclature
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
100 traitement de langage knock-94 (en utilisant Gensim): calcul de similarité avec WordSimilarity-353
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
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 traitements linguistiques knock-77 (en utilisant scicit-learn): mesure du taux de réponse
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
Traitement linguistique 100 knocks-29: Obtenez l'URL de l'image du drapeau