Вопрос

Я обучаю LSTM для анализа настроений в наборе данных обзора. здесь. Анкет Набор данных по обзору музыки содержит около 150 тыс. Данных данных (обзоры различной длины, помеченной POS или NEG). После создания словаря я запускаю сценарий в Python, чтобы заменить строки (слова) числами, которые Керас/Теано внедрит позже.

Проблема в том, что такой большой набор данных требует много времени для поиска. Я был бы признателен, если бы у кого -то было предложение по инструменту для более быстрого поиска или аналогичного. В настоящее время я просто пробегаю каждое слово в корпусе и заменяю его на соответствующее число из словаря (по сути кодируя 1-жаль)

РЕДАКТИРОВАТЬ:

Я делаю примерно следующее: каждый список Python - это предложение (до токенизации здесь):

'' Noble ',' engence_superlatives ', ...,' the_idea '

который я хочу сдаться в список целых чисел, например:

[143599, 12387,...,7582]

Я назвал это (вероятно, неправильно) как однокачественное кодирование, потому что для каждого слова в словаре есть ровно одно число.

Это было полезно?

Решение

Я хотел бы продлить Великий ответ @emre С другим примером - мы собираемся заменить все токенизированные слова из «1984» (C) Джордж Оруэлл (120 тыс. Слова):

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

Вывод: Потребовалось 66 мс, чтобы составить список чисел для списка со словами 120 тыс. Слова, содержащих 354,983 записи.

Другие советы

Вы делаете что -то не так. Я могу запрашивать дикта 100 тыс. В наносекундах

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

Вы можете использовать Три Из определения Википедии:

это своего рода дерево поиска - упорядоченная структура данных дерева, которая используется для хранения динамического набора или ассоциативного массива, где ключи обычно являются строками.

Пигтри предлагает реализацию попыток с интерфейсом DICT. Вот пример

import pygtrie as trie

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

structure = trie.Trie()

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

print structure['caterpillar']
Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top