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.
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の公式ヘルプ |
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 |
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.
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
"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)
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')
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 |
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
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