Pregunta

Estoy capacitando un LSTM para el análisis de sentimientos en un conjunto de datos de revisión descargado desde aquí. El conjunto de datos de revisión de la música contiene aproximadamente 150k puntos de datos (revisiones de una longitud variable etiquetada POS o NEG). Después de crear un diccionario, estoy ejecutando un script en Python para reemplazar las cadenas (palabras) con números que Keras/Theano incrustará más tarde.

El problema es que un conjunto de datos tan grande requiere mucho tiempo para la búsqueda. Agradecería si alguien tuviera sugerencias sobre una herramienta para una búsqueda más rápida o similar. Actualmente simplemente recorre cada palabra en el corpus y la reemplace con el número correspondiente del diccionario (1 candente esencialmente)

EDITAR:

Estoy haciendo aproximadamente lo siguiente: cada lista de Python es una oración (antes de la tokenización aquí):

'noble', 'interesante_superlativo', ..., 'the_idea'

que quiero conver con una lista de enteros, como:

[143599, 12387,...,7582]

Me referí a él (probablemente incorrectamente) como una codificación única porque para cada palabra hay exactamente un número en el diccionario.

¿Fue útil?

Solución

Me gustaría extender la gran respuesta de @emre Con otro ejemplo: vamos a reemplazar todas las palabras tokenizadas del "1984" (c) George Orwell (120k palabras):

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

Conclusión: Se necesitaron 66 ms para crear una lista de números para la lista con 120k palabras del diccionario que contenía 354.983 entradas.

Otros consejos

Estas haciendo algo mal. Puedo consultar una palabra de 100k dict en nanosegundos

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

Podrías usar un trie De la definición de Wikipedia:

es un tipo de árbol de búsqueda: una estructura de datos de árbol ordenada que se utiliza para almacenar un conjunto dinámico o una matriz asociativa donde las teclas suelen ser cadenas.

pigtrie Ofrece una implementación de intentos con una interfaz DICT. Aquí va un ejemplo

import pygtrie as trie

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

structure = trie.Trie()

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

print structure['caterpillar']
Licenciado bajo: CC-BY-SA con atribución
scroll top