[PYTHON] Réponses et impressions de 100 chocs de traitement linguistique - Partie 1

calendrier de l'avent Premier jour, mais écrivez quelque chose de facile à écrire sans aucune sensation particulière

c'est

Depuis que j'ai résolu 100 coups sur le traitement du langage, j'écrirai la réponse et l'impression une par une (actuellement 11/30 PM 20:30) Donc la partie qui peut être écrite est la première partie)

Conditions préalables

--Environnement

Réflexion

J'ai dû relire le code moi-même pour dessiner cet article, donc c'était une pseudo revue de code

--Mélangé " ʻet'` --Un mélange de r en ligne et l en ligne

De nombreuses améliorations ont été trouvées

Histoire principale

Chapitre 1: Mouvement préparatoire

00 Ordre inverse des chaînes

Récupère une chaîne dans laquelle les caractères de la chaîne "accentués" sont disposés à l'envers (de la fin au début).

## 00
smt = "stressed" 
ans = ""
for i in range(len(smt)):
    ans += smt[-i - 1]
print(ans)

Le style d'écriture que je ne connaissais pas est ↓

## 00
smt = "stressed"
smt[::-1]

En d'autres termes, c'était list [start: stop: step]

01 «Patatokukashi»

Retirez les 1er, 3e, 5e et 7e caractères de la chaîne de caractères "Patatokukashi" et récupérez la chaîne de caractères concaténée.

## 1
smt = "Patatoku Kashii"
''.join([smt[i] for i in range(len(smt)) if i % 2==0])

Je ne savais pas à ce stade, alors je vais réécrire ça aussi ↓

## 1
smt = "Patatoku Kashii"
smt[::2]

02 "Pat car" + "Tax" = "Patatokukasie"

Obtenez la chaîne de caractères "Patatokukashi" en reliant alternativement les caractères "Patcar" + "Tax" depuis le début.

## 2
smt1 = "Voiture Pat"
smt2 = "Taxi"
''.join([p + t for p, t in zip(smt1, smt2)])

Il y a un sentiment de graveleux

03 Taux circonférentiel

Décomposez la phrase "Maintenant j'ai besoin d'un verre, alcoolique bien sûr, après les lourdes conférences de mécanique quantique."

## 3
smt = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
[len(w) - w.count(',') - w.count('.') for w in smt.split(' ')]

Je voulais bien l'écrire en utilisant ʻisalpha () `, mais je ne pouvais pas bien faire la double boucle dans la notation d'inclusion, donc j'ai temporairement utilisé ceci comme réponse.

04 Symbole d'élément

Casser la phrase "Bonjour, il a menti parce que le bore ne pouvait pas oxyder le fluor. De nouvelles nations pourraient également signer la clause de sécurité de paix. Arthur King Can." Le 19e mot est le premier caractère et les autres mots sont les deux premiers caractères. Créer.

## 4
smt = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
dic = {}
target_index = [1, 5, 6, 7, 8, 9, 15, 16, 19]
for i, w in enumerate(smt.split(' ')):
    if i + 1 in target_index:
        dic[i + 1] = w[0]
    else:
        dic[i + 1] = w[:2]
dic    

Est-il acceptable de prendre un objectif ou une décision définitive? Est-il acceptable de diviser par si? Ou un démon suspect est trop dangereux, mais continuez comme ça

05 n-gram

Créez une fonction qui crée un n-gramme à partir d'une séquence donnée (chaîne, liste, etc.). Utilisez cette fonction pour obtenir le mot bi-gramme et la lettre bi-gramme de la phrase «Je suis un PNL».

## 5
def get_n_gram(n, smt):
    words = smt.split(' ')
    return  [smt[i:i+n] for i in range(len(smt) - n + 1)], [' '.join(words[i:i+n]) for i in range(len(words) -n + 1)]

get_n_gram(3, "I am an NLPer")

J'ai pensé que je pourrais bien l'écrire avec des tranches, donc il serait peut-être préférable de séparer les lettres et les mots

06 ensemble

Trouvez l'ensemble des bi-grammes de caractères contenus dans «paraparaparadise» et «paragraphe» comme X et Y, respectivement, et trouvez les ensembles de somme, de produit et de différence de X et Y, respectivement. En outre, découvrez si le bi-gram'se' est inclus dans X et Y.

## 6
smt1 = "paraparaparadise"
smt2 = "paragraph"
X = set()
for i in range(len(smt1) - 2 + 1):
    X.add(smt1[i:i+2])
Y = set()
for i in range(len(smt2) - 2 + 1):
    Y.add(smt2[i:i+2])
    
print(X | Y)
print(X & Y)
print(X - Y)
print('se' in (X and Y))
print('se' in (X or Y))

Appelons-le avec la notation d'inclusion ... J'ai reconfirmé que Set peut effacer les doublons, et quand je veux quelque chose d'unique dans la liste, il peut être défini une fois ou fourmi

07 Génération de phrases par modèle

Implémentez une fonction qui prend les arguments x, y, z et renvoie la chaîne "y at x is z". De plus, définissez x = 12, y = "température", z = 22,4 et vérifiez le résultat de l'exécution.

## 7
def get_template(x, y, z):
    return "{}de temps{}Est{}".format(x, y, z)

get_template(12, 'Température', 22.4)

Je pourrais le faire car je l'utilise habituellement, mais j'oublie souvent comment spécifier la position avec {0} etc.

08 Cryptographie

Implémentez la fonction de chiffrement qui convertit chaque caractère de la chaîne de caractères donnée avec les spécifications suivantes. Remplacer par (219 --character code) caractères si minuscules Afficher les autres caractères tels quels Utilisez cette fonction pour crypter / décrypter les messages en anglais.

## 8
class Coder:
    def __init__():
        pass
    
    def encode(smt):
        code = ""
        for i in range(len(smt)):
            if smt[i] .isalpha() and smt[i].islower():
                code += chr(219 - ord(smt[i]))
            else:
                code += smt[i]
        return code
    
    def decode(code):
        stm = ""
        for i in range(len(code)):
            if code[i] .isalpha() and code[i].islower():
                smt += chr(219 - ord(code[i]))
            else:
                smt += code[i]
        return smt

coder = Coder
smt =  "I couldn't believe that"
code = coder.encode(smt)
desmt = coder.encode(code)
print(smt)
print(code)
print(desmt)

J'avais un mauvais œil et un chiffrement erroné en tant que codeur jusqu'à ce moment, et c'était une fonction, pas une classe. Et j'oublierai le code du caractère peu importe le nombre de fois où je le chercherai, alors je veux le résumer la prochaine fois

09 Typoglycemia

Créez un programme qui réorganise de manière aléatoire l'ordre des autres caractères, en laissant le premier et le dernier caractère de chaque mot pour la chaîne de mots séparés par des espaces. Cependant, les mots d'une longueur de 4 ou moins ne sont pas réorganisés. Donnez une phrase en anglais appropriée (par exemple, "Je ne pouvais pas croire que je pouvais réellement comprendre ce que je lisais: le pouvoir phénoménal de l'esprit humain.") Et vérifiez le résultat de l'exécution.

## 9
import random
def feel_typoglycemia(smt):
    typogly = []
    for w in smt.split(' '):
        if len(w) <= 4:
            typogly.append(w)
        else:
            mid = list(w)[1:-1]
            random.shuffle(mid)
            typogly.append(w[0] + ''.join(mid) + w[-1])
    return ' '.join(typogly)

smt = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
feel_typoglycemia(smt)

J'ai enlevé seulement le début et la fin de la tranche, l'ai mélangée et attachée. Je ne connais pas l'origine du nom de la fonction parce que je ne m'en souviens pas à ce moment-là, mais je n'ai pas l'intention de le publier, il semble donc que je l'ai ajouté en fonction des sentiments à ce moment-là.

Chapitre 2: Principes de base des commandes UNIX

Je pensais que le titre était de vérifier la commande, mais la commande UNIX était juste pour vérifier le résultat de l'exécution du programme.

hightemp.txt est un fichier qui stocke l'enregistrement de la température la plus élevée au Japon dans le format délimité par des tabulations de «préfecture», «point», «℃» et «jour». Créez un programme qui effectue le traitement suivant et exécutez hightemp.txt en tant que fichier d'entrée. De plus, exécutez le même processus avec une commande UNIX et vérifiez le résultat de l'exécution du programme.

Compter 10 lignes

Comptez le nombre de lignes. Utilisez la commande wc pour confirmation.


## 10
with open('./hightemp.txt',) as f:
    print(len([r for r in f.read().split('\n') if r is not '']))
## 10
cat hightemp.txt | wc -l

Je pense que r est de ligne, mais après cela, il se mélange avec l en ligne

11 Remplacer les onglets par des espaces

Remplacez chaque caractère de tabulation par un caractère d'espace. Utilisez la commande sed, la commande tr ou la commande expand pour confirmation.

## 11
with open('./hightemp.txt',) as f:
    print([r.replace('\t', ' ') for r in f.read().split('\n') if r is not ''])
## 11
cat hightemp.txt | sed "s/\t/\ /g"
## 11
cat hightemp.txt | tr "\t" "\ "
## 11
expand -t 1 hightemp.txt

Je comprends que sed est un gars vim, alors tr et élargir apprenaient

12 Enregistrez la première colonne dans col1.txt et la deuxième colonne dans col2.txt

Enregistrez la colonne extraite de chaque ligne sous col1.txt et la colonne extraite 2 sous col2.txt. Utilisez la commande cut pour confirmation.

## 12
with open('./hightemp.txt',) as f:
    table = [r for r in f.read().split('\n') if r is not '']
    
with open('col1.txt', mode='w') as f:
    for t in table:
        f.write(t.split('\t')[0] + '\n')
with open('col2.txt', mode='w') as f:
    for t in table:
        f.write(t.split('\t')[1] + '\n')
## 12
cat hightemp.txt | sed "s/\t/\ /g" | cut -f 1 -d " " > col1.txt
cat hightemp.txt | sed "s/\t/\ /g" | cut -f 2 -d " " > col2.txt

Je l'ai fait honnêtement sans connaître l'image de l'opération verticale

13 Fusionner col1.txt et col2.txt

Combinez col1.txt et col2.txt créés dans> 12 pour créer un fichier texte dans lequel les première et deuxième colonnes du fichier d'origine sont séparées par des tabulations. Utilisez la commande coller pour confirmation.

## 13
with open('cols.txt', mode='w') as c:
    with open('col1.txt') as f:
        with open('col2.txt') as ff:
            r1 = f.readline()
            r2 = ff.readline()
            c.write(r1.replace('\n', '') + '\t' + r2)
            while r1:
                while r2:
                    r1 = f.readline()
                    r2 = ff.readline()
                    c.write(r1.replace('\n', '') + '\t' + r2)
## 13
paste col1.txt col2.txt > cols.txt
cat cols.txt

Sentiment d'inutilité exsudant de f, ff la pâte apprenait

14 Sortie de N lignes depuis le début

Recevoir le nombre naturel N au moyen d'un argument de ligne de commande et afficher uniquement les N premières lignes de l'entrée. Utilisez la commande head pour confirmation.

## 14
n = 5
with open('./hightemp.txt') as f:
    lines = f.read()
for l in lines.split('\n')[:n]:
    print(l)
head -n 5 hightemp.txt

C'est clairement une mauvaise réponse car j'ai oublié la partie de l'argument de ligne de commande, j'ajouterai celle utilisant sys.argv

15 Sortie des N dernières lignes

Recevoir le nombre naturel N au moyen d'un argument de ligne de commande, et n'afficher que les N dernières lignes de l'entrée. Utilisez la commande tail pour confirmation.

## 15
n = 5
with open('./hightemp.txt') as f:
    lines = f.read()
for l in lines.split('\n')[-n:]:
    print(l)
## 15
tail -n 5 hightemp.txt

De même, j'ai oublié la partie de l'argument de la ligne de commande, donc c'est une mauvaise réponse, je vais ajouter celle qui utilise sys.argv

16 Divisez le fichier en N

Recevez le nombre naturel N au moyen d'arguments de ligne de commande et divisez le fichier d'entrée en N ligne par ligne. Réalisez le même traitement avec la commande de fractionnement.

## 16
import math
with open('./hightemp.txt') as f:
    obj = f.read()
lines = [ l for l in obj.split('\n')]
n = 3
ni = math.ceil(len(lines) / n)
for i in range(0, len(lines), ni):
    j = i + ni
    print(len(lines[i:j]))
## 16
split -n 5 hightemp.txt 

De même, j'ai oublié la partie de l'argument de la ligne de commande, donc c'est une mauvaise réponse, je vais ajouter celle qui utilise sys.argv

17 Différence de chaîne de caractères dans la première colonne

Recherchez le type de chaîne de caractères dans la première colonne (un ensemble de chaînes de caractères différentes). Utilisez les commandes sort et uniq pour confirmation.

## 17
with open('./hightemp.txt') as f:
    obj = f.read()
set(row.split('\t')[0] for row in obj.split('\n') if not row =='')
## 17
cat hightemp.txt | sed "s/\t/\ /g" | cut -f 1 -d " "  | sort | uniq

C'est la première fois que je me connecte avec une pipe comme celle-ci, alors je connaissais la joie de One Liner

18 Trier chaque ligne dans l'ordre décroissant des nombres de la troisième colonne

Disposez chaque ligne dans l'ordre inverse des nombres de la troisième colonne (Remarque: réorganisez le contenu de chaque ligne sans les changer). Utilisez la commande sort pour confirmation (ce problème ne doit pas nécessairement correspondre au résultat de l'exécution de la commande).

## 18
with open('./hightemp.txt') as f:
    obj = f.read()
rows = [row for row in obj.split('\n') if not row =='']
sorted(rows, key=lambda x:  -1 * float(x.split('\t')[2]))
## 18
cat hightemp.txt | sed "s/\t/\ /g" | sort -r -k 3 -t " "

le flotteur avait besoin d'un plâtre

Trouvez la fréquence d'apparition de la première colonne de chaque ligne et organisez-les par ordre décroissant de fréquence d'apparition.

Trouvez la fréquence d'apparition de la première colonne de chaque ligne et affichez-les par ordre décroissant. Utilisez les commandes cut, uniq et sort pour confirmation.

## 19
with open('./hightemp.txt') as f:
    obj = f.read()
    
rows =[row.split('\t')[0] for row in obj.split('\n') if not row =='']
c_dic= {}
for k in set(rows):
    c_dic[k] = rows.count(k)
sorted(c_dic.items(), key=lambda x: -x[1])
## 19
cat hightemp.txt | sed "s/\t/\ /g" | cut -f 1 -d " " | sort  | uniq -c | sort -rn -k 3 -t " "

C'est un point de réflexion pour être r ou row

Chapitre 3: Expressions régulières

Il existe un fichier jawiki-country.json.gz qui exporte les articles Wikipedia dans le format suivant. Les informations sur un article par ligne sont stockées au format JSON Dans chaque ligne, le nom de l'article est stocké dans la clé "title" et le corps de l'article est stocké dans l'objet dictionnaire avec la clé "text", et cet objet est écrit au format JSON. Le fichier entier est gzippé Créez un programme qui effectue le traitement suivant.

J'ai l'impression d'avoir glissé sans utiliser trop d'expressions régulières

wget http://www.cl.ecei.tohoku.ac.jp/nlp100/data/jawiki-country.json.gz

Comme il fonctionnait sur le bloc-notes Juypter, exécutez-le avec un! Au début.

20 Lire les données JSON

Lisez le fichier JSON de l'article Wikipedia et affichez le texte de l'article sur "UK". Dans les problèmes 21-29, exécutez sur le texte de l'article extrait ici.

## 20
import json, gzip
with gzip.open('jawiki-country.json.gz', 'rt') as f:
    obj = json.loads(f.readline())
    while(obj):
        try:
            obj = json.loads(f.readline())
            if obj['title'] == "Angleterre":
                break
        except:
            obj = f.readline()

Je ne connaissais pas complètement gzip alors j'ai appris

21 Extraire les lignes contenant les noms de catégorie

Extrayez la ligne qui déclare le nom de la catégorie dans l'article.

## 21
for l in obj['text'].split('\n'):
    if 'Category' in l:
        print(l)

Des conditions plus strictes peuvent être meilleures

22 Extraction des noms de catégories

Extraire les noms des catégories d'articles (par nom, pas ligne par ligne).

## 22
import re
head_pattern = r'\[\[Category:'
tail_pattern = r'\|?\*?\]\]'
for l in obj['text'].split('\n'):
    if 'Category' in l:
        l = re.sub(head_pattern, '', l)
        print(re.sub(tail_pattern, '', l))

Je l'ai écrit sur le gorigori

Structure à 23 sections

Affichez les noms de sections et leurs niveaux contenus dans l'article (par exemple, 1 si "== nom de section ==").

## 23
pattern = '=='
for l in obj['text'].split('\n'):
    if pattern in l:
        pat_by_sec = ''.join([r'=' for i in range(int(l.count('=') / 2 ))])
        sec = len(pat_by_sec) - 1
        tab = ''.join(['\t' for i in range(sec - 1)])
        print('{}{}. {}'.format(tab, sec, l.replace('=', '')))

Un petit détour car je voulais mettre en retrait sur l'onglet lors de l'affichage

24 Extraction des références de fichiers

Extrayez tous les fichiers multimédias référencés dans l'article.

## 24
for l in obj['text'].split('\n'):
    if 'Fichier' in l:
        print(l.split(':')[1].split('|')[0])

Une déclaration if plus stricte peut être meilleure ici aussi

25 Extraction de modèle

Extraire les noms de champs et les valeurs du modèle "informations de base" inclus dans l'article et les stocker sous forme d'objet dictionnaire.

## 25
import re
pattern = r' = '
basic_info = {}
for l in obj['text'].split('\n'):
    if pattern in l:
        basic_info[l.split(' = ')[0].replace('|', '')] = l.split(' = ')[1]
basic_info

Il semble qu'il ne soit pas bon de connecter souvent des méthodes lors du traitement de texte

26 Suppression du balisage accentué

Au moment du traitement> 25, supprimez le balisage d'accentuation MediaWiki (tous d'accentuation faible, d'accentuation et d'accentuation forte) de la valeur du modèle et convertissez-le en texte (Référence: Tableau de référence rapide du balisage).

## 26
import re
pattern = r' = '
basic_info = {}
for l in obj['text'].split('\n'):
    if pattern in l:
        basic_info[l.split(' = ')[0].replace('|', '')] = l.split(' = ')[1].replace('\'', '')
basic_info

J'ai commencé à penser que j'aimerais procéder au codage en dur sans exiger de polyvalence dans le traitement de texte.

27 Suppression des liens internes

En plus du traitement de> 26, supprimez le balisage du lien interne MediaWiki de la valeur du modèle et convertissez-le en texte (Référence: Tableau de référence rapide du balisage).

## 27
import re
pattern = r' = '
med_link = r'\[|\]'

basic_info = {}
for l in obj['text'].split('\n'):
    if pattern in l:
        val =  l.split(' = ')[1].replace('\'', '')
        val =  re.sub(med_link, '', val)
        basic_info[l.split(' = ')[0].replace('|', '')] = val 
basic_info

Tout en regardant la sortie, je faisais des corrections de manière ponctuelle

28 Suppression du balisage MediaWiki

En plus de traiter> 27, supprimez autant que possible les balises MediaWiki des valeurs de modèle et formatez les informations de base sur le pays.

## 28
import re
pattern = r' = '
med_link = r'\[|\]'
strong = r'\{|\}'
tag = r'\<+.*\>'

basic_info = {}
for l in obj['text'].split('\n'):
    if pattern in l:
        val =  l.split(' = ')[1].replace('\'', '')
        val =  re.sub(med_link, '', val)
        val =  re.sub(strong, '', val)
        val =  re.sub(tag, '', val)
        basic_info[l.split(' = ')[0].replace('|', '')] = val 
basic_info

Abandonner a été rapide parce que c'était «autant que possible»

29 Obtenez l'URL de l'image du drapeau

Utilisez le contenu du modèle pour obtenir l'URL de l'image du drapeau. (Astuce: appelez imageinfo dans l'API MediaWiki pour convertir les références de fichiers en URL)

## 29
import requests
S = requests.Session()
URL = "https://en.wikipedia.org/w/api.php"
PARAMS = {
    "action": "query",
    "format": "json",
    "prop": "imageinfo",
    "iiprop": "url",
    "titles": "File:" + basic_info['Image du drapeau']
}

R = S.get(url=URL, params=PARAMS)
DATA = R.json()
PAGES = DATA["query"]["pages"]
for k, v in PAGES.items():
    for kk, vv in v.items():
        if kk == 'imageinfo':
            print(vv[0]['url'])

Hit api en référence au code de référence

Chapitre 4: Analyse morphologique

Utilisez MeCab pour analyser morphologiquement le texte (neko.txt) du roman de Natsume Soseki "Je suis un chat" et enregistrez le résultat dans un fichier appelé neko.txt.mecab. Utilisez ce fichier pour implémenter un programme qui répond aux questions suivantes. Pour les problèmes 37, 38, 39, utilisez matplotlib ou Gnuplot.

wget http://www.cl.ecei.tohoku.ac.jp/nlp100/data/neko.txt
import MeCab
t = MeCab.Tagger()
with open('./neko.txt') as f:
    text = f.read()
with open('./neko.txt.mecab', mode='w') as f:
    f.write(t.parse(text))

Jusqu'à présent, l'analyse était effectuée dans une série de processus sans enregistrer les résultats de l'analyse. Apprenez car cette opération semble être meilleure

30 Lecture des résultats de l'analyse morphologique

Implémentez un programme qui lit les résultats de l'analyse morphologique (neko.txt.mecab). Cependant, chaque élément morphologique est stocké dans un type de mappage avec la clé de forme de surface (surface), de forme de base (base), une partie du mot (pos) et une partie du mot sous-classification 1 (pos1), et une phrase est exprimée sous la forme d'une liste d'éléments morphologiques (type de mappage). Faisons le. Pour le reste des problèmes du chapitre 4, utilisez le programme créé ici.

## 30
doc = []
with open('./neko.txt.mecab') as f:
    token_list = []
    token = f.readline()
    while('EOS' not in token):
        dic = {}
        dic['surface'] = token.split('\t')[0]
        dic['base'] = token.split('\t')[1].split(',')[-3]
        dic['pos'] = token.split('\t')[1].split(',')[0]
        dic['pos1'] = token.split('\t')[1].split(',')[1]
        token = f.readline()
        if dic['surface'] == '。':
            doc.append(token_list)
            token_list = []
            continue
        token_list.

Il peut être préférable de stocker une fois la valeur de retour de token.split ('\ t')

31 verbe

Extraire toutes les formes de surface du verbe.

## 31
for s in doc:
    for t in s:
        if t['pos'] == 'verbe':
            print(t['surface'])

Maintenant, j'écrirais définitivement [t ['surface'] pour t dans s si t ['pos'] == 'verb']

32 Prototype du verbe

Extraire toutes les formes originales du verbe.

## 32
for s in doc:
    for t in s:
        if t['pos'] == 'verbe':
            print(t['base'])

De même, [t ['base'] pour t dans s si t ['pos'] == 'verb']

33 sahen substantif

Extraire toute la nomenclature de la connexion.

## 33
for s in doc:
    for t in s:
        if t['pos1'] == 'Changer de connexion':
            print(t['base'])

De même, [t ['base'] pour t dans s si t ['pos1'] == 'nom Sahen']

34 "B de A"

Extraire la nomenclature dans laquelle deux nomenclatures sont reliées par "non".

## 34
for s in doc:
    for i, t in enumerate(s):
        if t['surface'] == 'de' and i + 1 != len(s):
            if s[i -1]['pos'] == 'nom' and s[i +1]['pos'] == 'nom':
                print(s[i -1]['surface'] + t['base'] + s[i +1]['surface'])

Veillez à ne pas laisser l'index apparaître derrière, en supposant qu'aucune phrase ne commence par l'élément morphologique «non».

En supposant qu'il n'y ait pas de phrase commençant par l'élément morphologique "non"

Probablement pas bon

35 Concaténation du nez

Extraire la concaténation de la nomenclature (noms qui apparaissent consécutivement) avec la correspondance la plus longue.

## 35
## 35
max_list = []
tmp = ""
max_len = len(tmp)
for s in doc:
    for i, t in enumerate(s):
        if t['pos'] == 'nom' :
                tmp += t['surface']
        else:
            if len(tmp) == max_len:
                max_list.append(tmp)
            elif len(tmp) > max_len:
                max_list = []
                max_list.append(tmp)
                max_len = len(tmp)
            tmp = ''
print(len(max_list[0]))
print(max_list)

C'était 30 caractères en anglais

Fréquence de 36 mots

Trouvez les mots qui apparaissent dans la phrase et leur fréquence d'apparition, et classez-les par ordre décroissant de fréquence d'apparition.

## 36
base_list = []
count_dic = {}
for s in doc:
    for t in s:
        base_list.append(t['base'])
for word in set(base_list):
    count_dic[word] = base_list.count(word)
sorted(count_dic.items(), key=lambda x: -x[1])

base_list = [t ['base'] pour s dans doc pour t dans s]

37 Top 10 des mots les plus fréquents

Affichez les 10 mots avec une fréquence d'apparition élevée et leur fréquence d'apparition dans un graphique (par exemple, un histogramme).

## 37
import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline
n = 10
labels = [i[0] for i in sorted(count_dic.items(), key=lambda x: -x[1])[:n]]
score = [i[1] for i in sorted(count_dic.items(), key=lambda x: -x[1])[:n]]

plt.bar(labels, score)
plt.show()

Si j'étais accro à la définition de polices pour afficher le japonais dans matplotlib, j'en suis tombé sur une bonne appelée japanize-matplotlib.

38 histogramme

Tracez un histogramme de la fréquence d'occurrence des mots (l'axe horizontal représente la fréquence d'occurrence et l'axe vertical représente le nombre de types de mots qui prennent la fréquence d'occurrence sous forme de graphique à barres).

## 38
import matplotlib.pyplot as plt
import japanize_matplotlib
%matplotlib inline
all_score = [i[1] for i in sorted(count_dic.items(), key=lambda x: -x[1])]
plt.hist(all_score, range(10, 100));

De cet espace, je m'habitue à trier la liste des dictionnaires.

39 Loi de Zipf

Tracez les deux graphiques logarithmiques avec le classement de la fréquence des mots sur l'axe horizontal et la fréquence des mots sur l'axe vertical.

## 39
import math
log_idx = [math.log(i + 1) for i in range(len(count_dic.values()))]
log_all_score = [math.log(i[1]) for i in sorted(count_dic.items(), key=lambda x: -x[1])]
plt.scatter(log_idx, log_all_score, range(10, 100));

Je ne savais pas, donc c'était incroyable de voir la sortie J'ai utilisé les maths au lieu de numpy

fin

Est-il correct de publier le problème comme celui-ci, si cela ne fonctionne pas, je le supprimerai immédiatement Si vous avez une communauté comme un séminaire, vous devriez décider de 10 questions chaque semaine et passer en revue les uns les autres dans leur ensemble. Je veux résumer jusqu'au dernier dans le calendrier de l'Avent ~

Recommended Posts

Réponses et impressions de 100 chocs de traitement linguistique - Partie 1
Réponses et impressions de 100 chocs de traitement de la langue - Partie 2
Vue d'ensemble du traitement du langage naturel et de son prétraitement des données
Types de prétraitement dans le traitement du langage naturel et leur puissance
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
Logivan du langage artificiel et traitement du langage naturel (traitement du langage artificiel)
100 traitement du langage knock-59: analyse de la formule S
Résumé du traitement multi-processus du langage de script
100 traitement du langage knock-91: Préparation des données d'analogie
Traitement du langage 100 knocks-44: Visualisation des arbres dépendants
Traiter le nom de la carte Yugioh en langage naturel --Yugiou Data Science 2. PNL
100 traitement de langue knock-22: Extraction du nom de la catégorie
100 Language Processing Knock-26: suppression du balisage accentué
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)
100 traitements linguistiques frappent 03 ~ 05
100 coups de traitement linguistique (2020): 32
100 coups de traitement linguistique (2020): 35
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 42
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
100 coups de traitement linguistique (2020): 45
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
100 coups de traitement linguistique (2020): 10-19
100 coups de traitement linguistique (2020): 30
Traitement du langage 100 knocks-45: Extraction de modèles de cas verbaux
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 38
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 traitement de la langue frapper 00 ~ 02
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33
100 coups de traitement linguistique (2020): 20
100 coups de traitement linguistique (2020): 27
100 coups de traitement linguistique (2020): 46
Résumé du traitement pickle et unpickle des classes définies par l'utilisateur
Insoutenable manque d'attention dans le traitement du langage naturel
100 coups de traitement linguistique (2020): 21
100 coups de traitement linguistique (2020): 36
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 2 premier semestre)
[Traitement du langage 100 coups 2020] Résumé des exemples de réponses par Python
Traitement pleine largeur et demi-largeur des données CSV en Python
Traitement du langage 100 knocks-46: Extraction des informations de trame de cas de verbe
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
Vérification des performances du prétraitement des données dans le traitement du langage naturel