[PYTHON] 100 Sprachverarbeitung Knock-83 (mit Pandas): Messung der Wort- / Kontexthäufigkeit

Dies ist die Aufzeichnung der 83. "Messung der Wort- / Kontexthäufigkeit" von Language Processing 100 Knock 2015. Es dauert einige Zeit (ca. 7 Minuten), da es sich um einen Prozess für eine Datei mit ca. 800 MB handelt. Ich dachte, dass ein Speicherfehler auftreten würde, wenn ich sie alle auf einmal lese, und als ich versuchte, mit der Chunksize-Option von Pandas zu überleben, hatte ich Schwierigkeiten, weil ich es überhaupt nicht konnte. Immerhin konnte es auf einmal gelesen werden und es gab kein besonderes Problem.

Referenzlink

Verknüpfung Bemerkungen
083.Wort- / Kontextfrequenz messen.ipynb Antwortprogramm GitHub Link
100 Klicks Amateur-Sprachverarbeitung:83 Ich bin Ihnen immer mit 100 Sprachverarbeitungsklopfen zu Dank verpflichtet
100 Sprachverarbeitung klopfen 2015 Version(83,84) Ich habe in Kapitel 9 darauf hingewiesen.
Wie man Pandas groupby benutzt Leicht zu verstehen, wie man Pandas Group von verwendet
to_Beizfunktion to_Beizfunktionの公式ヘルプ

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.15 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.6.9 python3 auf pyenv.6.Ich benutze 9
3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden
Pakete werden mit venv verwaltet

In der obigen Umgebung verwende ich die folgenden zusätzlichen Python-Pakete. Einfach mit normalem Pip installieren.

Art Ausführung
pandas 0.25.3

Aufgabe

Kapitel 9: Vektorraummethode (I)

enwiki-20150112-400-r10-105752.txt.bz2 Ist der Text von 105.752 Artikeln zufällig 1/10 aus den Artikeln ausgewählt, die zum 12. Januar 2015 aus etwa 400 Wörtern oder mehr der englischen Wikipedia-Artikel bestehen und im bzip2-Format komprimiert sind. Gibt es. Mit diesem Text als Korpus möchte ich einen Vektor (verteilten Ausdruck) lernen, der die Bedeutung eines Wortes ausdrückt. In der ersten Hälfte von Kapitel 9 wird der Prozess des Lernens des Wortvektors implementiert, indem er in mehrere Prozesse unterteilt wird, indem die Hauptkomponentenanalyse auf die aus dem Korpus erstellte Matrix für das gleichzeitige Auftreten von Wortkontexten angewendet wird. In der zweiten Hälfte von Kapitel 9 wird der durch Lernen erhaltene Wortvektor (300 Dimensionen) verwendet, um die Ähnlichkeit von Wörtern zu berechnen und zu analysieren (analog).

Beachten Sie, dass bei gehorsamer Implementierung von Problem 83 eine große Menge (ca. 7 GB) Hauptspeicher erforderlich ist. Wenn Ihnen der Speicher ausgeht, erstellen Sie einen Prozess oder ein 1/100 Stichproben-Korpus enwiki-20150112-400-r100-10576.txt.bz2. Verwenden Sie /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).

Diesmal * 1/100 Stichprobenkorpus enwiki-20150112-400-r100-10576.txt.bz2 400-r100-10576.txt.bz2) "* wird verwendet.

83. Wort- / Kontextfrequenz messen

Verwenden Sie die Ausgabe von> 82, um die folgende Erscheinungsverteilung und Konstanten zu ermitteln.

  • $ f (t, c) $: Anzahl der gleichzeitigen Vorkommen von Wort $ t $ und Kontextwort $ c $
  • $ f (t, ∗) $: Anzahl der Vorkommen des Wortes $ t $
  • $ f (∗, c) $: Anzahl der Vorkommen des Kontextworts $ c $
  • $ N $: Gesamtzahl der Vorkommen von Wort / Kontext-Wortpaaren

Problemergänzung

"Word $ t $" ist [vorheriger Artikel](https://qiita.com/FukuharaYohei/items/64e20ced30cba76383dc#%E6%96%87%E8%84%88%E8%AA%9E%E3%81% Es ist ** "Zielwort" ** geschrieben in A8% E3% 81% AF). Angenommen, die Ausgabe von 82 ist wie folgt.

t(Zielsprache) c(Kontextwörter)
t1 c1
t1 c2
t2 c1
t1 c1

Dann wird Folgendes ausgegeben. Sogenannte SQL Group By.

** $ f (t, c) $: Anzahl der gleichzeitigen Vorkommen von Wort $ t $ und Kontextwort $ c $ **

t(Zielsprache) c(Kontextwörter) Anzahl der gleichzeitigen Vorkommen
t1 c1 2
t1 c2 1
t2 c1 1

** $ f (t, ∗) $: Anzahl der Vorkommen des Wortes $ t $ **

t(Zielsprache) Anzahl der Auftritte
t1 3
t2 1

** $ f (∗, c) $: Anzahl der Vorkommen des Kontextworts $ c $ **

c(Kontextwörter) Anzahl der Auftritte
c1 3
c2 1

** $ N $: Gesamtzahl der Vorkommen von Wort / Kontext-Wortpaaren ** 4 (weil das Ganze 4 Zeilen ist)

Antworten

Antwortprogramm [083. Messwort- / Kontextfrequenz.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) / 083.% 20% E5% 8D% 98% E8% AA% 9E% EF % BC% 8F% E6% 96% 87% E8% 84% 88% E3% 81% AE% E9% A0% BB% E5% BA% A6% E3% 81% AE% E8% A8% 88% E6% B8 % AC.ipynb)

import sys

import pandas as pd

df = pd.read_table('./082.context.txt', header=None, names=['t', 'c'])
print(df.info())

def to_pickle_file(grouped, path):
    print('length:', grouped.size)
    grouped.to_pickle(path)

to_pickle_file(df.groupby(['t','c'])['c'].agg('count'), './083_group_tc.zip')
to_pickle_file(df.groupby('t')['c'].agg('count'), './083_group_t.zip')
to_pickle_file(df.groupby('c')['c'].agg('count'), './083_group_c.zip')

Kommentar beantworten

Ich benutze Pandas, um eine "c" -Datei mit dem Spaltennamen "t" zu laden.

df = pd.read_table('./082.context.txt', header=None, names=['t', 'c'])
print(df.info())

Als Ergebnis von "df.info ()" wird Folgendes ausgegeben, und Sie können sehen, dass das Ergebnis von * "$ N $: Gesamtzahl der Vorkommen von Wort / Kontext-Wortpaaren" * 6800317 ist. Sie können auch sehen, dass es etwa 1 GB Speicher benötigt. Der Leseteil dauerte übrigens ca. 1,5 Minuten.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 68000317 entries, 0 to 68000316
Data columns (total 2 columns):
t    object
c    object
dtypes: object(2)
memory usage: 1.0+ GB
None

Hier wird die Zählung des "Groupby" -Ergebnisses von Pandas durch "Pickle" gespeichert. Wenn Sie die Dateierweiterung auf zip setzen, wird sie automatisch komprimiert, was praktisch ist. Wenn Sie die hier gespeicherte Datei laden, können Sie sie als dasselbe Pandas Series-Objekt wiederherstellen wie beim Speichern.

def to_pickle_file(grouped, path):
    print('length:', grouped.size)
    grouped.to_pickle(path)

Dies ist der Hauptteil dieser Zeit. Die Gruppierung erfolgt mit "groupby" von Pandas und das Ergebnis wird gezählt.

to_pickle_file(df.groupby(['t','c'])['c'].agg('count'), './083_group_tc.zip')
to_pickle_file(df.groupby('t')['c'].agg('count'), './083_group_t.zip')
to_pickle_file(df.groupby('c')['c'].agg('count'), './083_group_c.zip')

Das Folgende sind übrigens die Informationen zu jedem Prozess.

Anzahl der Zeilen Verarbeitungszeit Dateigröße
$ f(t,c) $ 21,327,Linie 945 4min 38s 103.7MB
$ f(t,*) $ 388,Linie 836 34.7s 2.8MB
$ f(*,c) $ 388,Linie 836 24.2s 2.8MB

Tipps / Fehlerbehebungssystem

Tipps: Dateien verkleinern

Da die Zieldatei groß ist (ca. 800 MB), war das Ausprobieren sehr schwierig. Daher habe ich zunächst eine Datei erstellt und codiert, die nur die ersten 100.000 Zeilen abdeckt.

cat 082.context.txt | head -n 100000 >> 082.context_mini.txt

Geben Sie bestimmte Zeilen in großen Dateien aus

Wenn in Zeile XX in "DataFrame" ein Fehler aufgetreten ist, habe ich "head" und "tail" kombiniert, um den Inhalt der Datei anzuzeigen. Normalerweise öffne ich die Datei einfach, aber bei großen Dateien dauert das Öffnen einige Zeit, also habe ich dies getan. Der folgende Befehl zeigt die Zeilen 12198 bis 3 der Datei an. Übrigens ist dieser Fehler ein Fehler im Zusammenhang mit der Tokenisierung des in "Spill" im vorherigen Artikel geschriebenen Satzes.

$ cat 082.context.txt | head -n 124150 | tail -n 3

"b")("s"	"c
−	"b")("s"
−	"c

Recommended Posts

100 Sprachverarbeitung Knock-83 (mit Pandas): Messung der Wort- / Kontexthäufigkeit
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
Sprachverarbeitung 100 Knocks-31 (mit Pandas): Verben
100 Sprachverarbeitung Knock-38 (mit Pandas): Histogramm
100 Sprachverarbeitung Knock-33 (mit Pandas): Sahen Nomen
100 Sprachverarbeitung Knock-35 (mit Pandas): Nomenklatur
100 Sprachverarbeitung Knock-39 (mit Pandas): Zipf-Gesetz
100 Sprachverarbeitung Knock-34 (mit Pandas): "B von A"
100 Sprachverarbeitung Knock-20 (unter Verwendung von Pandas): Lesen von JSON-Daten
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100-Sprach-Verarbeitung Knock-98 (unter Verwendung von Pandas): Clustering nach Ward-Methode
100 Sprachverarbeitung Knock-99 (mit Pandas): Visualisierung durch t-SNE
100 Sprachverarbeitung Knock-95 (mit Pandas): Bewertung mit WordSimilarity-353
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
100 Sprachverarbeitung Knock-30 (unter Verwendung von Pandas): Lesen der Ergebnisse der morphologischen Analyse
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
Sprachverarbeitung 100 knock-86: Wortvektoranzeige
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock-73 (mit Scikit-Learn): Lernen
100 Sprachverarbeitung Knock-74 (mit Scicit-Learn): Vorhersage
100 Sprachverarbeitung Knock-97 (mit Scicit-Learn): k-bedeutet Clustering
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitung Knock-71 (mit Stanford NLP): Stoppwort
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock-93 (unter Verwendung von Pandas): Berechnung der Genauigkeitsrate der Analogie-Aufgabe
100 Sprachverarbeitung Knock-90 (mit Gensim): Lernen mit word2vec
100-Sprach-Verarbeitung Knock-79 (mit Scikit-Learn): Präzisions-Recall-Grafikzeichnung
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Sprachverarbeitung Knock-72 (unter Verwendung von Stanford NLP): Identitätsextraktion
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitung Knock-32 (mit Pandas): Prototyp des Verbs
100 Sprachverarbeitung Knock-75 (mit Scicit-Learn): Gewicht der Identität
100 Sprachverarbeitung Knock-36 (unter Verwendung von Pandas): Häufigkeit des Auftretens von Wörtern
100 Sprachverarbeitung Knock-92 (mit Gensim): Anwendung auf Analogiedaten
100 Sprachverarbeitung Knock-94 (mit Gensim): Ähnlichkeitsberechnung mit WordSimilarity-353
100 Sprachverarbeitung Knock-37 (mit Pandas): Top 10 der häufigsten Wörter
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
Verarbeitung natürlicher Sprache 3 Wortkontinuität
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020