У меня есть список предложений, где каждое предложение разделено на слова.Я имею в виду, sentences
выглядит здесь:
[['word0', 'word1'], ['word2', 'word3', 'word4', 'word5'],
['word6', 'word7', 'word8'], ....]
Каждое предложение имеет некоторую длину, поэтому я нахожу max_sentence_len
как
max_sentence_len=max(max_sentence_len, len(current_sentence))
Я хочу иметь матрицу и массив.Давайте возьмем какое-то предложение ['word2, 'word3', 'word4', 'word5']
:
'word2' ---> 'word3'
'word2' 'word3' ---> 'word4'
'word2' 'word3' 'word4' ---> 'word5'
Итак, в матрице это будет:
matrix[0, 0] = 'word2' ---> array[0] = 'word3'
matrix[1 0] = 'word2', matrix[1 1] = 'word3' ---> array[1] = 'word4'
....
Сделайте это для всех предложений!
Итак, прежде всегоЯ считаю, сколько строк будет в матрице:
summ = 0
for line in sentences:
summ += len(line)-1
Чем я делаю матрицу и массив, как объяснено:
train_x = np.zeros([summ, max_sentence_len], dtype=np.int32)
train_y = np.zeros([summ], dtype=np.int32)
ind = 0
for sentence in sentences:
for i in range(len(sentence)-1):
for j in range(i+1):
train_x[ind, j] = word2idx(sentence[j])
train_y[ind] = word2idx(sentence[i+1])
ind += 1
print('train_x shape:', train_x.shape)
print('train_y shape:', train_y.shape)
Где word2idx
просто дают индекс слова в словаре.
Работает хорошо!Но слишком долго (если summ
, например, больше 630000
)
Можно ли сделать это быстрее?
UPD: Для лучшего понимания давайте рассмотрим пример.Позвольте нам следовать следующим предложениям: «Карандаш красный», «Они странные», «Ни одно наследие не так богато, как честность».Вот так мои sentences
будут:
[['the', 'pencil', 'is', 'red'],
['they', 'are', 'strange'],
['no', 'legacy', 'is', 'so', 'rich', 'as', 'honesty']]
Далее (создать матрицу и массив):
train_x --> train_y:
the --> pencil
the pencil --> is
the pencil is --> red
they --> are
the are --> strange
no --> legacy
no legacy --> is
no legacy is --> so
no legacy is so --> rich
no legacy is so rich --> as
no legacy is so rich as --> honesty
Таким образом, суммирование train_x
будет:
max_sentence_len = 7
[ [the 0 0 0 0 0 0]
[the pencil 0 0 0 0 0 0]
[the pencil is 0 0 0 0]
[they 0 0 0 0 0 0]
[they are 0 0 0 0 0]
[no 0 0 0 0 0 0]
[no legacy 0 0 0 0 0]
[no legacy is 0 0 0 0]
[no legacy is so 0 0 0]
[no legacy is so rich 0 0]
[no legacy is so rich as 0] ]
train_y
: [pencil, is, red, are, strange, legacy, is, so, rich, as, honesty ]
Конечно, это не совсем слова в матрице и массиве - они индексируют в словаре (word2idx
) Создать словарь можно просто, например:
vocab = []
for sentence in sentences:
for word in sentence:
if word not in vocab:
vocab.append(word)
и word2idx
просто как:
def word2idx(word)
return vocab.index(word)