Разделить строку по словам - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть список предложений, где каждое предложение разделено на слова.Я имею в виду, 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...