[PYTHON] Antworten und Eindrücke von 100 Sprachverarbeitungsklopfen - Teil 1

Adventskalender Erster Tag, aber schreibe etwas, das ohne besonderes Gefühl leicht zu schreiben ist

das ist

Da ich [100 Klopfen bei der Sprachverarbeitung] gelöst habe (http://www.cl.ecei.tohoku.ac.jp/nlp100/), werde ich die Antwort und den Eindruck einzeln schreiben (derzeit 23.30 Uhr, 20.30 Uhr). Der Teil, der geschrieben werden kann, ist also der erste Teil.

Voraussetzungen

--Umgebung

Betrachtung

Ich musste den Code selbst noch einmal lesen, um diesen Artikel zu zeichnen, also war es eine Pseudocode-Überprüfung

Es wurden viele Verbesserungen gefunden

Hauptgeschichte

Kapitel 1: Vorbereitende Bewegung

00 Reihenfolge der Zeichenfolgen in umgekehrter Reihenfolge

Holen Sie sich eine Zeichenfolge, in der die Zeichen der Zeichenfolge "betont" umgekehrt angeordnet sind (vom Ende bis zum Anfang).

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

Der Schreibstil, den ich nicht kannte, ist ↓

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

Mit anderen Worten, es war "Liste [Start: Stopp: Schritt]"

01 "Patatokukashi"

Nehmen Sie das 1., 3., 5. und 7. Zeichen der Zeichenkette "Patatokukashi" heraus und erhalten Sie die verkettete Zeichenkette.

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

Ich wusste es zu diesem Zeitpunkt noch nicht, also werde ich es auch umschreiben ↓

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

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

Erhalten Sie die Zeichenkette "Patatokukashi", indem Sie die Zeichen "Pattocar" + "Tax" von Anfang an abwechselnd verbinden.

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

Es ist ein Gefühl von Grobheit

03 Umfangsrate

Teilen Sie den Satz "Jetzt brauche ich nach den schweren Vorlesungen über Quantenmechanik einen Alkoholiker auf." In Wörter auf und erstellen Sie eine Liste mit der Anzahl der (alphabetischen) Zeichen in jedem Wort in der Reihenfolge ihres Auftretens.

## 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(' ')]

Ich wollte es gut mit isalpha () schreiben, aber ich konnte die Doppelschleife in der Einschlussnotation nicht gut machen, also habe ich dies vorübergehend als Antwort verwendet.

04 Elementsymbol

Brechen Sie den Satz "Hi He Lied, weil Bor Fluor nicht oxidieren konnte. Neue Nationen könnten auch die Friedenssicherheitsklausel unterzeichnen. Arthur King Can." In die Wörter 1, 5, 6, 7, 8, 9, 15, 16, Das 19. Wort ist das erste Zeichen, und die anderen Wörter sind die ersten beiden Zeichen. Erstellen.

## 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    

Ist es in Ordnung, ein Ziel oder eine endgültige Entscheidung zu treffen? Ist es in Ordnung, durch wenn zu teilen? Oder verdächtiger Dämon ist zu gefährlich, aber fahren Sie so fort, wie er ist

05 n-gram

Erstellen Sie eine Funktion, die aus einer bestimmten Sequenz (Zeichenfolge, Liste usw.) ein n-Gramm erstellt. Verwenden Sie diese Funktion, um das Wort Bi-Gramm und den Buchstaben Bi-Gramm aus dem Satz "Ich bin ein NLPer" zu erhalten.

## 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")

Ich dachte, ich könnte es gut mit Scheiben schreiben, deshalb ist es vielleicht besser, die Buchstaben und Wörter zu trennen

06 eingestellt

Suchen Sie den in "paraparaparadise" und "Absatz" enthaltenen Satz von Zeichen-Bi-Gramm als X bzw. Y und suchen Sie die Summen-, Produkt- und Differenzsätze von X bzw. Y. Finden Sie außerdem heraus, ob das Bi-Gramm in X und Y enthalten ist.

## 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))

Nennen wir es mit Einschlussnotation ... Ich habe erneut bestätigt, dass Set Duplikate löschen kann, und wenn ich etwas Einzigartiges aus der Liste möchte, kann es einmal oder ant gesetzt werden

07 Satzerstellung nach Vorlage

Implementieren Sie eine Funktion, die die Argumente x, y, z verwendet und die Zeichenfolge "y bei x ist z" zurückgibt. Setzen Sie außerdem x = 12, y = "Temperatur", z = 22,4 und überprüfen Sie das Ausführungsergebnis.

## 7
def get_template(x, y, z):
    return "{}von Zeit{}Ist{}".format(x, y, z)

get_template(12, 'Temperatur', 22.4)

Ich könnte dies tun, weil ich es normalerweise benutze, aber ich vergesse oft, wie man die Position mit {0} usw. angibt.

08 Kryptographie

Implementieren Sie die Funktionsverschlüsselung, die jedes Zeichen der angegebenen Zeichenfolge gemäß den folgenden Spezifikationen konvertiert. Durch Kleinbuchstaben ersetzen (219 - Zeichencode) Geben Sie andere Zeichen so aus, wie sie sind Verwenden Sie diese Funktion, um englische Nachrichten zu verschlüsseln / entschlüsseln.

## 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)

Ich hatte bis zu diesem Moment ein schlechtes Auge und eine falsche Chiffre als Kodierer, und es war eine Funktion, keine Klasse. Und ich werde den Zeichencode vergessen, egal wie oft ich ihn nachschlage, also möchte ich ihn das nächste Mal zusammenfassen

09 Typoglycemia

Erstellen Sie ein Programm, das die Reihenfolge der anderen Zeichen zufällig neu anordnet, wobei das erste und das letzte Zeichen jedes Wortes für die Wortfolge durch Leerzeichen getrennt bleiben. Wörter mit einer Länge von 4 oder weniger werden jedoch nicht neu angeordnet. Geben Sie einen geeigneten englischen Satz ein (zum Beispiel: "Ich konnte nicht glauben, dass ich tatsächlich verstehen konnte, was ich las: die phänomenale Kraft des menschlichen Geistes.") Und überprüfen Sie das Ausführungsergebnis.

## 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)

Ich entfernte nur den Anfang und das Ende der Scheibe, mischte sie und befestigte sie. Ich kenne den Ursprung des Funktionsnamens nicht, weil ich mich zu diesem Zeitpunkt nicht erinnere, aber ich habe nicht vor, ihn zu veröffentlichen. Es scheint also, dass ich ihn aufgrund der damaligen Gefühle hinzugefügt habe.

Kapitel 2: Grundlagen des UNIX-Befehls

Ich dachte, der Titel sollte den Befehl überprüfen, aber der UNIX-Befehl diente nur zum Überprüfen des Ausführungsergebnisses des Programms.

hightemp.txt ist eine Datei, in der die Aufzeichnung der höchsten Temperatur in Japan im tabulatorgetrennten Format "Präfektur", "Punkt", "℃" und "Tag" gespeichert wird. Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt, und führen Sie hightemp.txt als Eingabedatei aus. Führen Sie außerdem denselben Prozess mit einem UNIX-Befehl aus und überprüfen Sie das Ausführungsergebnis des Programms.

10 Zeilen zählen

Zählen Sie die Anzahl der Zeilen. Verwenden Sie zur Bestätigung den Befehl wc.


## 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

Ich denke, r ist aus der Reihe, aber danach mischt es sich mit l in der Reihe

11 Ersetzen Sie die Registerkarten durch Leerzeichen

Ersetzen Sie jedes Tabulatorzeichen durch ein Leerzeichen. Verwenden Sie zur Bestätigung den Befehl sed, den Befehl tr oder den Befehl expand.

## 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

Ich verstehe, dass sed ein Vim-Typ ist, also lernten tr und expand

12 Speichern Sie die erste Spalte in col1.txt und die zweite Spalte in col2.txt

Speichern Sie die extrahierte Spalte jeder Zeile als col1.txt und die extrahierte Spalte 2 als col2.txt. Verwenden Sie zur Bestätigung den Befehl cut.

## 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

Ich habe es ehrlich gemacht, ohne das Bild der vertikalen Operation zu kennen

13 Führen Sie col1.txt und col2.txt zusammen

Kombinieren Sie col1.txt und col2.txt, die in> 12 erstellt wurden, um eine Textdatei zu erstellen, in der die erste und die zweite Spalte der Originaldatei tabulatorgetrennt angeordnet sind. Verwenden Sie zur Bestätigung den Befehl Einfügen.

## 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

Ein Gefühl der Nutzlosigkeit, das von f und ff ausgeht Paste lernte

14 Geben Sie von Anfang an N Zeilen aus

Empfangen Sie die natürliche Zahl N beispielsweise über ein Befehlszeilenargument und zeigen Sie nur die ersten N Zeilen der Eingabe an. Verwenden Sie zur Bestätigung den Befehl head.

## 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

Es ist eine eindeutig falsche Antwort, da ich den Teil des Befehlszeilenarguments vergessen habe. Ich werde den Teil mit sys.argv hinzufügen

15 Geben Sie die letzten N Zeilen aus

Empfangen Sie die natürliche Zahl N beispielsweise über ein Befehlszeilenargument und zeigen Sie nur die letzten N Zeilen der Eingabe an. Verwenden Sie zur Bestätigung den Befehl tail.

## 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

Ebenso habe ich den Befehlszeilenargumentteil vergessen, daher ist es eine eindeutig falsche Antwort. Ich werde die mit sys.argv hinzufügen

16 Teilen Sie die Datei in N.

Empfangen Sie die natürliche Zahl N mithilfe von Befehlszeilenargumenten und teilen Sie die Eingabedatei zeilenweise in N. Erzielen Sie die gleiche Verarbeitung mit dem Befehl split.

## 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 

Ebenso habe ich den Befehlszeilenargumentteil vergessen, daher ist es eine eindeutig falsche Antwort. Ich werde die mit sys.argv hinzufügen

17 Unterschied in der Zeichenfolge in der ersten Spalte

Suchen Sie den Typ der Zeichenfolge in der ersten Spalte (eine Reihe verschiedener Zeichenfolgen). Verwenden Sie zur Bestätigung die Befehle sort und uniq.

## 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

Es ist das erste Mal, dass ich mich mit einer solchen Pfeife verbinde, also kannte ich die Freude von One Liner

18 Sortieren Sie jede Zeile in absteigender Reihenfolge der Zahlen in der dritten Spalte

Ordnen Sie jede Zeile in umgekehrter Reihenfolge der Zahlen in der dritten Spalte an (Hinweis: Ordnen Sie den Inhalt jeder Zeile neu an, ohne ihn zu ändern). Verwenden Sie den Befehl sort zur Bestätigung (dieses Problem muss nicht mit dem Ergebnis der Ausführung des Befehls übereinstimmen).

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

float brauchte eine Besetzung

19 Ermitteln Sie die Häufigkeit des Auftretens der ersten Spalte jeder Zeile und ordnen Sie sie in absteigender Reihenfolge der Häufigkeit des Auftretens an.

Ermitteln Sie die Häufigkeit des Auftretens der ersten Spalte jeder Zeile und zeigen Sie sie in absteigender Reihenfolge an. Verwenden Sie zur Bestätigung die Befehle cut, uniq und sort.

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

Es ist ein Reflexionspunkt, r oder row zu sein

Kapitel 3: Reguläre Ausdrücke

Es gibt eine Datei jawiki-country.json.gz, die Wikipedia-Artikel im folgenden Format exportiert. Informationen zu einem Artikel pro Zeile werden im JSON-Format gespeichert In jeder Zeile wird der Artikelname im Schlüssel "title" und der Artikelkörper im Wörterbuchobjekt mit dem Schlüssel "text" gespeichert, und dieses Objekt wird im JSON-Format ausgeschrieben. Die gesamte Datei wird komprimiert Erstellen Sie ein Programm, das die folgende Verarbeitung ausführt.

Ich habe das Gefühl, ich bin durchgeglitten, ohne zu viele reguläre Ausdrücke zu verwenden

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

Da es auf dem Juypter-Notebook lief, führen Sie es mit einem! Am Anfang aus.

20 JSON-Daten lesen

Lesen Sie die JSON-Datei des Wikipedia-Artikels und zeigen Sie den Artikeltext zu "UK" an. Führen Sie in den Problemen 21-29 den hier extrahierten Artikeltext aus.

## 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'] == "England":
                break
        except:
            obj = f.readline()

Ich kannte gzip nicht ganz und lernte es

21 Extrahieren Sie Zeilen mit Kategorienamen

Extrahieren Sie die Zeile, in der der Kategoriename im Artikel angegeben ist.

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

Strengere Bedingungen können besser sein

22 Extraktion von Kategorienamen

Extrahieren Sie die Namen der Artikelkategorien (nach Namen, nicht zeilenweise).

## 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))

Ich habe es auf die Gorigori geschrieben

23 Abschnittsstruktur

Zeigen Sie die im Artikel enthaltenen Abschnittsnamen und deren Ebenen an (z. B. 1, wenn "== Abschnittsname ==").

## 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('=', '')))

Ein kleiner Umweg, weil ich beim Anzeigen auf der Registerkarte einrücken wollte

24 Dateireferenzen extrahieren

Extrahieren Sie alle Mediendateien, auf die aus dem Artikel verwiesen wird.

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

Eine strengere if-Aussage könnte auch hier besser sein

25 Vorlagenextraktion

Extrahieren Sie die Feldnamen und Werte der im Artikel enthaltenen Vorlage "Basisinformationen" und speichern Sie sie als Wörterbuchobjekt.

## 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

Es scheint nicht gut zu sein, Methoden bei der Textverarbeitung häufig zu verbinden

26 Entfernen von hervorgehobenem Markup

Entfernen Sie zum Zeitpunkt der Verarbeitung> 25 das MediaWiki-Hervorhebungs-Markup (alle schwachen Hervorhebungen, Hervorhebungen und starken Hervorhebungen) aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: Markup-Kurzreferenztabelle).

## 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

Ich begann zu denken, dass ich mit der harten Codierung fortfahren möchte, ohne Vielseitigkeit in der Textverarbeitung zu fordern

27 Entfernen interner Links

Entfernen Sie zusätzlich zur Verarbeitung von> 26 das interne Link-Markup für MediaWiki aus dem Vorlagenwert und konvertieren Sie es in Text (Referenz: Markup-Kurzreferenztabelle).

## 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

Während ich mir die Ausgabe ansah, nahm ich Ad-hoc-Korrekturen vor

28 Entfernen des MediaWiki-Markups

Entfernen Sie zusätzlich zur Verarbeitung> 27 MediaWiki-Markups so weit wie möglich aus den Vorlagenwerten und formatieren Sie grundlegende Länderinformationen.

## 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

Aufgeben war schnell, weil es "so viel wie möglich" war.

29 Rufen Sie die URL des Flaggenbildes ab

Verwenden Sie den Inhalt der Vorlage, um die URL des Flaggenbilds abzurufen. (Hinweis: Rufen Sie imageinfo in der MediaWiki-API auf, um Dateiverweise in URLs zu konvertieren.)

## 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['Flaggenbild']
}

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'])

Drücken Sie die API mit Bezug auf den Referenzcode

Kapitel 4: Morphologische Analyse

Verwenden Sie MeCab, um den Text (neko.txt) von Natsume Sosekis Roman "Ich bin eine Katze" morphologisch zu analysieren und das Ergebnis in einer Datei namens neko.txt.mecab zu speichern. Verwenden Sie diese Datei, um ein Programm zu implementieren, das die folgenden Fragen beantwortet. Verwenden Sie für die Probleme 37, 38, 39 matplotlib oder 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))

Bisher wurde die Analyse in einer Reihe von Prozessen durchgeführt, ohne die Analyseergebnisse zu speichern. Lernen Sie, weil diese Operation besser zu sein scheint

30 Ergebnisse der morphologischen Analyse lesen

Implementieren Sie ein Programm, das die Ergebnisse der morphologischen Analyse liest (neko.txt.mecab). Jedes morphologische Element wird jedoch in einem Zuordnungstyp mit dem Schlüssel der Oberflächenform (Oberfläche), der Grundform (Basis), einem Teil des Wortes (pos) und einem Teil der Wortunterklassifizierung 1 (pos1) gespeichert, und ein Satz wird als Liste morphologischer Elemente (Zuordnungstyp) ausgedrückt. Machen wir das. Verwenden Sie für die restlichen Probleme in Kapitel 4 das hier erstellte Programm.

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

Es ist möglicherweise besser, den Rückgabewert von "token.split (" \ t ")" einmal zu speichern

31 verb

Extrahieren Sie alle Oberflächenformen des Verbs.

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

Jetzt würde ich definitiv [t ['Oberfläche'] für t in s schreiben, wenn t ['pos'] == 'Verb']

32 Prototyp des Verbs

Extrahieren Sie alle Originalformen des Verbs.

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

In ähnlicher Weise ist [t ['base'] für t in s, wenn t ['pos'] == 'verb']

33 Sahen Substantiv

Extrahieren Sie die gesamte Nomenklatur der Verbindung.

## 33
for s in doc:
    for t in s:
        if t['pos1'] == 'Verbindung ändern':
            print(t['base'])

In ähnlicher Weise ist [t ['base'] für t in s, wenn t ['pos1'] == 'Sahen noun']

34 "B von A"

Extrahieren Sie die Nomenklatur, in der zwei Nomenklaturen durch "Nein" verbunden sind.

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

Achten Sie darauf, dass der Index nicht herausspringt, vorausgesetzt, es gibt keinen Satz, der mit dem morphologischen Element "no" beginnt.

Angenommen, es gibt keinen Satz, der mit dem morphologischen Element "nein" beginnt.

Wahrscheinlich nicht gut

35 Nasenverkettung

Extrahieren Sie die Verkettung der Nomenklatur (Substantive, die nacheinander erscheinen) mit der längsten Übereinstimmung.

## 35
## 35
max_list = []
tmp = ""
max_len = len(tmp)
for s in doc:
    for i, t in enumerate(s):
        if t['pos'] == 'Substantiv' :
                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)

Es waren 30 Zeichen in Englisch

36 Worthäufigkeit

Finden Sie die Wörter, die im Satz erscheinen, und ihre Häufigkeit des Auftretens, und ordnen Sie sie in absteigender Reihenfolge der Häufigkeit des Auftretens an.

## 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'] für s in doc für t in s]

37 Top 10 der häufigsten Wörter

Zeigen Sie die 10 am häufigsten vorkommenden Wörter und ihre Häufigkeit des Auftretens in einem Diagramm an (z. B. einem Balkendiagramm).

## 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()

Wenn ich süchtig danach war, Schriftarten für die Anzeige von Japanisch in matplotlib festzulegen, stieß ich auf eine gute Schrift namens japanize-matplotlib.

38 Histogramm

Zeichnen Sie ein Histogramm der Häufigkeit des Auftretens von Wörtern (die horizontale Achse repräsentiert die Häufigkeit des Auftretens und die vertikale Achse repräsentiert die Anzahl der Arten von Wörtern, die die Häufigkeit des Auftretens als Balkendiagramm verwenden).

## 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));

In diesem Bereich gewöhne ich mich daran, die Liste der Wörterbücher zu sortieren.

39 Zipfs Gesetz

Zeichnen Sie beide logarithmischen Diagramme mit der Wortfrequenzrangfolge auf der horizontalen Achse und der Wortfrequenz auf der vertikalen Achse.

## 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));

Ich wusste es nicht, also war es erstaunlich, die Ausgabe zu sehen Ich habe Mathe anstelle von Numpy verwendet

Ende

Ist es in Ordnung, das Problem so zu posten? Wenn es nicht funktioniert, werde ich es sofort löschen Wenn Sie eine Community wie ein Seminar haben, sollten Sie jede Woche 10 Fragen entscheiden und sich gegenseitig als Ganzes überprüfen. Ich möchte bis zum letzten im Adventskalender ~ zusammenfassen

Recommended Posts

Antworten und Eindrücke von 100 Sprachverarbeitungsklopfen - Teil 1
Antworten und Eindrücke von 100 Sprachverarbeitungsklopfen - Teil 2
Überblick über die Verarbeitung natürlicher Sprache und ihre Datenvorverarbeitung
Arten der Vorverarbeitung in der Verarbeitung natürlicher Sprache und ihre Leistungsfähigkeit
100 Sprachverarbeitung Knock-42: Anzeige der Phrase der betroffenen Person und der betroffenen Person
Künstliche Sprache Logivan und Verarbeitung natürlicher Sprache (Verarbeitung künstlicher Sprache)
100 Sprachverarbeitung Knock-59: Analyse der S-Formel
Zusammenfassung der Mehrprozessverarbeitung der Skriptsprache
100 Sprachverarbeitung Knock-91: Vorbereitung von Analogiedaten
Sprachverarbeitung 100 Knocks-44: Visualisierung abhängiger Bäume
Verarbeiten Sie den Namen der Yugioh-Karte in natürlicher Sprache - Yugiou Data Science 2. NLP
100 Sprachverarbeitung Knock-22: Extraktion des Kategorienamens
100 Sprachverarbeitung Knock-26: Entfernen von hervorgehobenem Markup
Rehabilitation von Python- und NLP-Kenntnissen ab "100 Language Processing Knock 2015" (Kapitel 1)
100 Sprachverarbeitungsklopfen 03 ~ 05
100 Sprachverarbeitungsklopfen (2020): 32
100 Sprachverarbeitungsklopfen (2020): 35
100 Sprachverarbeitungsklopfen (2020): 47
100 Sprachverarbeitungsklopfen (2020): 39
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 42
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen (2020): 49
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
100 Sprachverarbeitungsklopfen (2020): 45
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100 Sprachverarbeitungsklopfen (2020): 10-19
100 Sprachverarbeitungsklopfen (2020): 30
Sprachverarbeitung 100 Schläge-45: Extraktion von Verbfallmustern
100 Sprachverarbeitungsklopfen (2020): 00-09
100 Sprachverarbeitungsklopfen (2020): 31
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Sprachverarbeitungsklopfen (2020): 48
100 Sprachverarbeitungsklopfen (2020): 44
100 Sprachverarbeitungsklopfen (2020): 41
100 Sprachverarbeitungsklopfen (2020): 37
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitungsklopfen (2020): 25
100 Sprachverarbeitungsklopfen (2020): 23
100 Sprachverarbeitungsklopfen (2020): 33
100 Sprachverarbeitungsklopfen (2020): 20
100 Sprachverarbeitungsklopfen (2020): 27
100 Sprachverarbeitungsklopfen (2020): 46
Zusammenfassung der Pickle- und Unpickle-Verarbeitung von benutzerdefinierten Klassen
Unerträgliche Aufmerksamkeitsmangel bei der Verarbeitung natürlicher Sprache
100 Sprachverarbeitungsklopfen (2020): 21
100 Sprachverarbeitungsklopfen (2020): 36
Rehabilitation von Python- und NLP-Kenntnissen ab "100 Language Processing Knock 2015" (Kapitel 2, erste Hälfte)
[Sprachverarbeitung 100 Schläge 2020] Zusammenfassung der Antwortbeispiele von Python
Verarbeitung von CSV-Daten in voller und halber Breite in Python
Sprachverarbeitung 100 Knocks-46: Extraktion von Verbfall-Frame-Informationen
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
[Kapitel 6] Einführung in Scicit-Learn mit 100 Klopfen Sprachverarbeitung
Leistungsüberprüfung der Datenvorverarbeitung in der Verarbeitung natürlicher Sprache