Question

Je suis une formation LSTM pour l'analyse des sentiments sur un ensemble de données d'examen téléchargé à partir de . L'ensemble de données d'examen de la musique contient sur les points de données 150K (avis de longueur variable pos ou nég marqués). Après avoir créé un dictionnaire, je suis en cours d'exécution d'un script en Python pour remplacer des chaînes (mots) avec des chiffres qui keras / Théano intégreront plus tard.

Le problème est qu'un tel grand jeu de données nécessite beaucoup de temps pour la recherche. Je vous serais reconnaissant si quelqu'un avait suggéré sur un outil pour accélérer recherche ou similaire. Actuellement, je boucle juste par chaque mot dans le corpus et le remplacer par le numéro correspondant du dictionnaire (encodage 1-chaud essentiellement)

EDIT:

Je fais à peu près ce qui suit: chaque liste Python est une phrase (avant tokenization ici):

[ 'noble', 'interesting_superlatives', ..., 'the_idea']

que je veux Conver à une liste d'entiers, comme:

[143599, 12387, ..., 7582]

je en ai parlé (probablement à tort) que l'encodage d'un chaud parce que pour chaque mot il y a exactement un numéro dans le dictionnaire.

Était-ce utile?

La solution

Je voudrais étendre la grande @ réponse de Emre avec un autre exemple - nous allons remplacer tous mots lexicalisés de la "1984" (c) George Orwell (120K mots):

In [163]: %paste
import requests
import nltk
import pandas as pd

# source: https://github.com/dwyl/english-words
fn = r'D:\temp\.data\words.txt'
url = 'http://gutenberg.net.au/ebooks01/0100021.txt'

r = requests.get(url)

# read words into Pandas DataFrame
df = pd.read_csv(fn, header=None, names=['word'])
# shuffle DF, so we will have random indexes
df = df.sample(frac=1)
# convert Pandas DF into dictionary: {'word1': unique_number1, 'word2': unique_number2, ...}
lkp = df.reset_index().set_index('word')['index'].to_dict()

# tokenize "1984" (c) George Orwell
words = nltk.tokenize.word_tokenize(r.text)

print('Word Dictionary size: {}'.format(len(lkp)))
print('We have tokenized {} words...'.format(len(words)))
## -- End pasted text --
Word Dictionary size: 354983
We have tokenized 120251 words...

In [164]: %timeit [lkp.get(w, 0) for w in words]
10 loops, best of 3: 66.3 ms per loop

Conclusion: il a fallu 66 ms pour construire une liste de numéros pour la liste avec 120K mots du dictionnaire contenant 354.983 entrées

.

Autres conseils

Vous faites quelque chose de mal. Je peux interroger un mot 100K dict dans nanosecondes

word_list = open('/usr/share/dict/words').read().split()
len(word_list)

> 99171

word_dict = {word: hash(word) for word in word_list}
%timeit word_dict['blazing']

> 10000000 loops, best of 3: 33.8 ns per loop

Vous pouvez utiliser un Trie de la définition de Wikipedia:

est une sorte d'arbre une recherche structure de données d'arbre ordonné qui est utilisé pour stocker un ensemble de dynamique ou d'un tableau associatif dont les clés sont généralement cordes.

pygtrie offre une mise en œuvre d'essais avec une interface dict. Voici un exemple va

import pygtrie as trie

words = ['cat', 'caterpillar', 'dog', 'mouse']

structure = trie.Trie()

for i, word in enumerate(words):
   structure[word] = i

print structure['caterpillar']
Licencié sous: CC-BY-SA avec attribution
scroll top