[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 90

Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Kapitel 10: Vektorraummethode (II)

In Kapitel 10 werden wir weiter daran arbeiten, Wortvektoren aus dem vorherigen Kapitel zu lernen.

90. Lernen mit word2vec

Wenden Sie word2vec auf den in> 81 erstellten Korpus an und lernen Sie den Wortvektor. Konvertieren Sie außerdem das Format des gelernten Wortvektors und führen Sie das Programm 86-89 aus.

Der fertige Code:

main.py


# coding: utf-8
import pickle
from collections import OrderedDict
import numpy as np
from scipy import io
import word2vec

fname_input = 'corpus81.txt'
fname_word2vec_out = 'vectors.txt'
fname_dict_index_t = 'dict_index_t'
fname_matrix_x300 = 'matrix_x300'

#Vektorisiert mit word2vec
word2vec.word2vec(train=fname_input, output=fname_word2vec_out,
	size=300, threads=4, binary=0)

#Lesen Sie das Ergebnis und erstellen Sie eine Matrix und ein Wörterbuch
with open(fname_word2vec_out, 'rt') as data_file:

	#Holen Sie sich die Anzahl der Begriffe und Dimensionen aus der ersten Zeile
	work = data_file.readline().split(' ')
	size_dict = int(work[0])
	size_x = int(work[1])

	#Wörterbücher und Warteschlangen
	dict_index_t = OrderedDict()
	matrix_x = np.zeros([size_dict, size_x], dtype=np.float64)

	for i, line in enumerate(data_file):
		work = line.strip().split(' ')
		dict_index_t[work[0]] = i
		matrix_x[i] = work[1:]

#Ergebnisse exportieren
io.savemat(fname_matrix_x300, {'matrix_x300': matrix_x})
with open(fname_dict_index_t, 'wb') as data_file:
	pickle.dump(dict_index_t, data_file)

Ausführungsergebnis:

Wenn main.py ausgeführt wird, wird "corpus81.txt", das in Problem 81 erstellt wurde, mit word2vec gelesen und gelernt, und "matrix_x300.mat" und "dict_index_t" Ausgabe an. Die Bearbeitungszeit auf meinem Computer betrug ca. 4 Minuten.

Das Format der beiden erstellten Dateien ist das gleiche wie in Problem 85. Wenn Sie also die Dateien ersetzen, [Problem 86](http: // qiita). Die Programme von com / segavvy / items / d0cfabf328fd6d67d003) bis Problem 89 können so ausgeführt werden, wie sie sind. Unten sind die Ergebnisse.

Ergebnis von Problem 86

Es zeigt den Vektor "United_States" an, sodass nur 300 Zahlen in einer Reihe stehen.

Ausführungsergebnis von Problem 86


[  2.32081000e-01   1.34141400e+00   7.57177000e-01   9.18121000e-01
   1.41462400e+00   4.61902000e-01  -3.19372000e-01  -9.11796000e-01
   6.74263000e-01   8.88596000e-01   8.66489000e-01   4.41949000e-01
  -6.52780000e-02  -5.73398000e-01  -1.72020000e-01   2.79280000e-01
  -1.61161000e-01   4.50549000e-01   7.46780000e-02  -3.13907000e-01
  -4.32671000e-01   6.18620000e-02  -1.27725100e+00   6.85341000e-01
   3.03760000e-02  -3.19811000e-01  -7.68924000e-01  -2.62472000e-01
   4.91034000e-01   9.34251000e-01  -6.05433000e-01  -5.19170000e-02
  -6.72454000e-01   1.55326600e+00  -7.37928000e-01   1.66526200e+00
  -6.69270000e-02   8.88963000e-01  -6.68554000e-01   2.86349000e-01
  -1.27271300e+00  -1.21432000e-01   1.26359000e+00   1.25684600e+00
   1.97781000e-01   8.14802000e-01   2.05766000e-01  -4.26121000e-01
   7.07411000e-01   7.51749000e-01   6.40161000e-01  -3.28497000e-01
   4.20656000e-01   4.26616000e-01  -2.29688000e-01  -4.02054000e-01
  -2.33294000e-01  -6.42150000e-02  -7.11624000e-01   1.82619000e-01
  -7.58055000e-01  -2.03132000e-01   5.12000000e-04   1.31971700e+00
   1.03481400e+00   2.22623000e-01   6.24024000e-01   9.64505000e-01
  -7.62032000e-01  -3.60960000e-02   4.45112000e-01  -5.08120000e-01
  -1.00680500e+00  -2.55381000e-01   8.55365000e-01   6.17396000e-01
  -7.78720000e-01  -6.18505000e-01   1.21397000e-01  -1.69275000e-01
   6.60319000e-01  -3.36548000e-01  -5.62175000e-01  -2.04378300e+00
  -7.94834000e-01  -4.65775000e-01  -7.54679000e-01   3.90806000e-01
  -8.01828000e-01  -4.92555000e-01   3.47642000e-01  -4.28183000e-01
  -1.99666800e+00   1.82001000e-01  -1.70085000e-01   9.28966000e-01
  -1.96638600e+00   9.23961000e-01   4.84498000e-01  -5.24912000e-01
   1.02234000e+00   4.62904000e-01   4.10672000e-01   6.97174000e-01
   6.19435000e-01   8.32230000e-02   1.41234000e-01   6.12439000e-01
  -1.45182000e+00   1.85729000e-01   5.67926000e-01  -3.29128000e-01
  -3.83217000e-01   3.79447000e-01  -5.50135000e-01  -4.12838000e-01
  -4.16418000e-01   1.05820000e-02   6.92200000e-02  -6.27480000e-02
   1.24219800e+00  -3.96815000e-01  -4.01746000e-01  -6.71752000e-01
   7.81617000e-01  -8.54749000e-01  -1.07806700e+00   7.44280000e-02
  -1.91329200e+00  -1.21407300e+00  -5.23873000e-01  -1.01673500e+00
   4.35801000e-01   1.73546700e+00  -7.54100000e-01  -5.14167000e-01
  -2.15539000e-01  -6.96321000e-01   1.45136000e-01   6.40906000e-01
  -4.21082000e-01  -3.60932000e-01  -2.98236100e+00   1.05500300e+00
  -5.42376000e-01   2.06387000e-01   2.28400000e-02  -1.87433000e-01
  -4.26448000e-01  -7.00808000e-01  -1.91694000e-01  -6.80270000e-02
   8.37304000e-01   6.18913000e-01   3.09183000e-01  -2.22531000e-01
  -3.08164000e-01   1.91496000e+00  -2.05698000e-01  -1.38298000e+00
   1.08415000e-01   5.35886000e-01  -2.32130000e-02   6.94406000e-01
  -4.17144000e-01  -1.90199000e+00   6.69315000e-01  -6.32312000e-01
  -3.45570000e-02  -6.03989000e-01   3.56266000e-01  -1.02690000e+00
   4.67688000e-01   5.27140000e-02   3.66741000e-01   1.92638600e+00
   6.22386000e-01   4.83680000e-01   1.00020800e+00   4.46445000e-01
   4.13120000e-01   2.12195000e-01   1.56286000e-01   1.33522500e+00
   6.97672000e-01   5.66884000e-01   1.53622000e-01   6.39750000e-01
  -2.03707000e-01   2.10565800e+00  -1.17320000e-01   8.55233000e-01
   2.61317700e+00  -2.14519000e-01   8.55025000e-01   9.06171000e-01
  -4.56919000e-01  -1.40941000e-01  -6.24079000e-01  -1.26463800e+00
  -9.31688000e-01   9.94177000e-01  -6.76021000e-01  -9.58533000e-01
   4.40553000e-01  -1.23600000e-03  -5.81909000e-01   3.57520000e-01
  -7.99588000e-01   1.11611700e+00  -4.93985000e-01   1.23746500e+00
  -7.51088000e-01  -9.28216000e-01   3.05621000e-01  -5.11757000e-01
   1.05883000e-01   4.88388000e-01   8.31103000e-01  -5.05967000e-01
  -1.01836400e+00  -2.54270000e-01  -4.25978000e-01   2.21318000e-01
  -7.14479000e-01   3.37610000e-01  -6.56314000e-01  -3.55550000e-01
   2.31042000e-01  -9.86197000e-01  -7.63255000e-01   1.04544800e+00
   1.57370400e+00   1.95025900e+00   5.00542000e-01  -5.48677000e-01
   5.21174000e-01  -2.04218000e-01  -2.11823000e-01  -2.30830000e-01
   1.45851700e+00  -2.69244000e-01  -8.57567000e-01   1.28116000e+00
   1.18514300e+00   7.82615000e-01  -7.24170000e-02  -1.07394300e+00
  -5.76223000e-01   5.17903000e-01   6.55052000e-01   1.56492300e+00
   1.58710000e-01   1.64205300e+00   4.27021000e-01   1.65960000e-01
   1.27899000e-01   2.45154000e-01  -3.33136000e-01   3.69693000e-01
   6.90610000e-01  -5.47800000e-01   1.87585000e-01   6.63304000e-01
  -1.18193300e+00  -3.42415000e-01  -1.97505000e-01   1.55585000e+00
   6.80237000e-01   7.02119000e-01  -1.39572100e+00  -2.07230000e-02
  -4.62809000e-01  -4.94772000e-01   2.25839000e-01   3.32944000e-01
  -7.71918000e-01  -8.55043000e-01  -5.98472000e-01  -1.60165800e+00
  -3.56646000e-01  -3.89552000e-01  -7.58449000e-01   2.03913000e-01
   2.84149000e-01  -5.72755000e-01  -4.92234000e-01  -1.15743600e+00
  -5.41931000e-01  -7.22312000e-01   8.08674000e-01  -3.62800000e-02
   2.92228000e-01   4.90371000e-01   5.50050000e-01   1.82185000e-01
  -2.12689000e-01  -1.03393500e+00   1.97234000e-01  -2.13381000e-01]
Ergebnisse von Problem 87

Die Kosinusähnlichkeit zwischen "USA" und "USA" wird berechnet, ist jedoch ein hoher Wert.

Ausführungsergebnis von Problem 87


0.858448973235
Ergebnisse von Problem 88

Es ist ein Problem, nach etwas in der Nähe von "England" zu suchen, aber im Gegensatz zum Ergebnis von Problem 88 wird das britische Land zuerst ordnungsgemäß aufgeführt. word2vec ist unglaublich.

Ausführungsergebnis von Problem 88


Wales	0.7539543550055905
Scotland	0.7386559299178808
Britain	0.6479338653237635
Ireland	0.6348035977770026
Sweden	0.6046247805709913
Spain	0.6012807753931683
Germany	0.5945993118023707
England.	0.5886246671101062
Norway	0.5712078065200615
London	0.5622154447245881
Ergebnisse von Problem 89

Es ist ein Problem, die Hauptstadt von Athen zu erraten. In Problem 89 war die richtige Antwort "Griechenland" der 8. und die Kosinusähnlichkeit 0,75, was ein wenig niedrig war, aber in word2vec war sie mit 0,81 auf dem 3. Platz ausgezeichnet. ist.

Ausführungsergebnis von Problem 89


Spain	0.8975386269080241
Austria	0.8165995526197494
Greece	0.8115120679668039
Egypt	0.8108041287727046
Italy	0.7967845991447613
Russia	0.7903349902284371
Denmark	0.784935131008747
Sweden	0.7731913094622944
Germany	0.7689020148989952
Portugal	0.7634638759682534

Was ist word2vec?

"Word2vec" ist eine Open Source-Implementierung zum Vektorisieren von Wörtern. Es macht das, was wir in Kapitel 9 gemacht haben, aber es ist eine große Funktion, dass es ein neuronales Netzwerk für die dimensionale Komprimierung verwendet. Für Details finden Sie viele Informationen bei Google mit "word2vec", daher werde ich sie hier weglassen. Außerdem habe ich bei O'Reillys Verarbeitung natürlicher Sprache durch word2vec studiert, aber es war ziemlich leicht zu verstehen.

Installieren Sie word2vec

Es scheint einige word2vec-Implementierungen zu geben, die mit Python verwendet werden können, aber dieses Mal habe ich die in pip gefundene word2vec-Wrapper-Bibliothek verwendet. Sie können es mit pip install word2vec installieren.

python


segavvy@ubuntu:~$ pip search word2vec
brocas-lm (1.0)                  - Broca's LM is a free python library
                                   providing a probabilistic language model
                                   based on a Recurrent Neural Network (RNN)
                                   with Long Short-Term Memory (LSTM). It
                                   utilizes Gensim's Word2Vec implementation
                                   to transform input word sequences into a
                                   dense vector space. The output of the model
                                   is a seqeuence of probability distributions
                                   across the given vocabulary.
word2vec-wikification-py (0.16)  - A package to run wikification
sense2vec (0.6.0)                - word2vec with NLP-specific tokens
ShallowLearn (0.0.5)             - A collection of supervised learning models
                                   based on shallow neural network approaches
                                   (e.g., word2vec and fastText) with some
                                   additional exclusive features
theano-word2vec (0.2.1)          - word2vec using Theano and Lasagne
word2vec (0.9.1)                 - Wrapper for Google word2vec
word2veckeras (0.0.5.2)          - word2vec based on Kearas and gensim
segavvy@ubuntu:~$ pip install word2vec
Collecting word2vec
  Downloading word2vec-0.9.1.tar.gz (49kB)
    100% |████████████████████████████████| 51kB 1.9MB/s 
Requirement already satisfied: numpy in ./anaconda3/lib/python3.5/site-packages (from word2vec)
Requirement already satisfied: cython in ./anaconda3/lib/python3.5/site-packages (from word2vec)
Building wheels for collected packages: word2vec
  Running setup.py bdist_wheel for word2vec ... done
  Stored in directory: /home/segavvy/.cache/pip/wheels/f9/fa/6a/4cdbfefd2835490548505e4136b8f41f063d8f3c4639bf0f53
Successfully built word2vec
Installing collected packages: word2vec
Successfully installed word2vec-0.9.1

Wenn Sie damit "Word 2 vec importieren" können, ist die Installation abgeschlossen.

segavvy@ubuntu:~$ python
Python 3.5.2 |Anaconda 4.1.1 (64-bit)| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import word2vec
>>> 

Verwendung von word2vec

Wenn Sie im Python-Interpreter "help (word2vec.word2vec)" verwenden, wird die Parameterbeschreibung angezeigt. Obwohl es auf Englisch ist, scheint es im Grunde dasselbe zu sein wie die Befehlszeilenoption von word2vec selbst.

Hilfe im Python-Interpreter(word2vec.word2vec)Ergebnis von


Help on function word2vec in module word2vec.scripts_interface:

word2vec(train, output, size=100, window=5, sample='1e-3', hs=0, negative=5, threads=12, iter_=5, min_count=5, alpha=0.025, debug=2, binary=1, cbow=1, save_vocab=None, read_vocab=None, verbose=False)
    word2vec execution
    
    Parameters for training:
        train <file>
            Use text data from <file> to train the model
        output <file>
            Use <file> to save the resulting word vectors / word clusters
        size <int>
            Set size of word vectors; default is 100
        window <int>
            Set max skip length between words; default is 5
        sample <float>
            Set threshold for occurrence of words. Those that appear with
            higher frequency in the training data will be randomly
            down-sampled; default is 0 (off), useful value is 1e-5
        hs <int>
            Use Hierarchical Softmax; default is 1 (0 = not used)
        negative <int>
            Number of negative examples; default is 0, common values are 5 - 10
            (0 = not used)
        threads <int>
            Use <int> threads (default 1)
        min_count <int>
            This will discard words that appear less than <int> times; default
            is 5
        alpha <float>
            Set the starting learning rate; default is 0.025
        debug <int>
            Set the debug mode (default = 2 = more info during training)
        binary <int>
            Save the resulting vectors in binary moded; default is 0 (off)
        cbow <int>
            Use the continuous back of words model; default is 1 (skip-gram
            model)
        save_vocab <file>
            The vocabulary will be saved to <file>
        read_vocab <file>
            The vocabulary will be read from <file>, not constructed from the
            training data

Ich werde die Details weglassen, aber Sie können den Namen der Eingabedatei mit "train", den Namen der Ausgabedatei des Ergebnisses mit "output", die Anzahl der Dimensionen mit "size" und die Anzahl der Threads angeben, die für die Verarbeitung mit "threads" verwendet werden. Die Anzahl der Dimensionen wird als "300" angegeben, um dem bisherigen Problem zu entsprechen. Da das Ergebnis von word2vec nach der Ausführung in dasselbe Format wie Problem 85 konvertiert werden muss, setzen Sie "binary = 0", damit das Ergebnis leicht gelesen werden kann. Geben Sie das Ergebnis an und konvertieren Sie es in das Textformat.

Analyse der word2vec-Ergebnisdatei

In der Ergebnisdatei des word2vec-Textformats werden die Anzahl der Begriffe und die Anzahl der Dimensionen (= 300) in der ersten durch Leerzeichen getrennten Zeile ausgegeben. Die zweite und die nachfolgenden Zeilen sind ein Term pro Zeile, und jede Zeile gibt 300 Werte jeder Dimension aus, die dem Term entsprechen, getrennt durch Leerzeichen.

Wenn Sie die Sprache C verwenden können, sehen Sie sich die Quelle von word2vec selbst an. Da jedoch der Wert + blank in der Schleife ausgegeben wird, die den Wert jeder Dimension ausgibt, wird am Ende der Zeile ein zusätzliches Leerzeichen hinzugefügt. .. Seien Sie vorsichtig beim Lesen.

word2vec.Quellenauszug des Ergebnisausgabeteils von c


    // Save the word vectors
    fprintf(fo, "%lld %lld\n", vocab_size, layer1_size);
    for (a = 0; a < vocab_size; a++) {
      fprintf(fo, "%s ", vocab[a].word);
      if (binary) for (b = 0; b < layer1_size; b++) fwrite(&syn0[a * layer1_size + b], sizeof(real), 1, fo);
      else for (b = 0; b < layer1_size; b++) fprintf(fo, "%lf ", syn0[a * layer1_size + b]);
      fprintf(fo, "\n");
    }

In diesem Programm haben wir zuerst eine Ergebnisdatei mit dem Namen "vectors.txt" mit word2vec erstellt, gelesen und in "matrix_x300.mat" und "dict_index_t" konvertiert.

word2vec hat eine kleinere Ergebnisdateigröße

Ich habe die gleiche Anzahl von Dimensionen für die gleichen Daten angegeben, aber word2vec hat eine kleinere Größe der Ergebnisdatei. Dies liegt daran, dass die Funktion zum Entfernen niederfrequenter Wörter funktioniert. Sie können es mit "min_count" anpassen, aber je kleiner die Größe der Ergebnisdatei ist, desto schneller ist der Vorgang. Diesmal habe ich es im Standardzustand belassen (Begriffe mit einer Häufigkeit von weniger als 5 entfernen).

Darüber hinaus hat word2vec auch die Funktion, häufig verwendete Wörter zufällig zu entfernen. Dies kann mit "Probe" eingestellt werden.

Das ist alles für den 91. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.


Recommended Posts

100 Amateur-Sprachverarbeitungsklopfen: 71
100 Amateur-Sprachverarbeitungsklopfen: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 59
100 Amateur-Sprachverarbeitungsklopfen: 70
100 Amateur-Sprachverarbeitungsklopfen: 62
100 Amateur-Sprachverarbeitungsklopfen: 60
100 Amateur-Sprachverarbeitungsklopfen: 92
100 Amateur-Sprachverarbeitungsklopfen: 30
100 Amateur-Sprachverarbeitungsklopfen: 06
100 Amateur-Sprachverarbeitungsklopfen: 84
100 Amateur-Sprachverarbeitungsklopfen: 81
100 Amateur-Sprachverarbeitungsklopfen: 33
100 Amateur-Sprachverarbeitungsklopfen: 46
100 Amateur-Sprachverarbeitungsklopfen: 88
100 Amateur-Sprachverarbeitungsklopfen: 89
100 Amateur-Sprachverarbeitungsklopfen: 40
100 Amateur-Sprachverarbeitungsklopfen: 45
100 Amateur-Sprachverarbeitungsklopfen: 43
100 Amateur-Sprachverarbeitungsklopfen: 55
100 Amateur-Sprachverarbeitungsklopfen: 22
100 Amateur-Sprachverarbeitungsklopfen: 61
100 Amateur-Sprachverarbeitungsklopfen: 94
100 Amateur-Sprachverarbeitungsklopfen: 54
100 Amateur-Sprachverarbeitungsklopfen: 04
100 Amateur-Sprachverarbeitungsklopfen: 63
100 Amateur-Sprachverarbeitungsklopfen: 78
100 Amateur-Sprachverarbeitungsklopfen: 12
100 Amateur-Sprachverarbeitungsklopfen: 14
100 Amateur-Sprachverarbeitungsklopfen: 08
100 Amateur-Sprachverarbeitungsklopfen: 19
100 Amateur-Sprachverarbeitungsklopfen: 73
100 Amateur-Sprachverarbeitungsklopfen: 75
100 Amateur-Sprachverarbeitungsklopfen: 98
100 Amateur-Sprachverarbeitungsklopfen: 83
100 Amateur-Sprachverarbeitungsklopfen: 95
100 Amateur-Sprachverarbeitungsklopfen: 32
100 Amateur-Sprachverarbeitungsklopfen: 87
100 Amateur-Sprachverarbeitungsklopfen: 79
100 Amateur-Sprachverarbeitungsklopfen: 23
100 Amateur-Sprachverarbeitungsklopfen: 05
100 Amateur-Sprachverarbeitungsklopfen: 00
100 Amateur-Sprachverarbeitungsklopfen: 02
100 Amateur-Sprachverarbeitungsklopfen: 68
100 Amateur-Sprachverarbeitungsklopfen: 11
100 Amateur-Sprachverarbeitungsklopfen: 90
100 Amateur-Sprachverarbeitungsklopfen: 74
100 Amateur-Sprachverarbeitungsklopfen: 66
100 Amateur-Sprachverarbeitungsklopfen: 28
100 Amateur-Sprachverarbeitungsklopfen: 64
100 Amateur-Sprachverarbeitungsklopfen: 34
100 Amateur-Sprachverarbeitungsklopfen: 36
100 Amateur-Sprachverarbeitungsklopfen: 77
100 Amateur-Sprachverarbeitungsklopfen: 01
100 Amateur-Sprachverarbeitungsklopfen: 16
100 Amateur-Sprachverarbeitungsklopfen: 27
100 Amateur-Sprachverarbeitungsklopfen: 10
100 Amateur-Sprachverarbeitungsklopfen: 03
100 Amateur-Sprachverarbeitungsklopfen: 82
100 Amateur-Sprachverarbeitungsklopfen: 69