Я создаю программу, и часть моей программы имеет функцию для поиска данных окна с window_size = 2

Мой код .

string = [['I', 'have', 'a', 'pen', 'to', 'use']]

window_size = 2
windowData = []
for lines in string:
    for index,word in enumerate(lines):
        for words in lines[max(index-window_size,0):min(index+window_size,len(string)+1)]:
            if words != word:
                windowData.append([word,words])

print(windowData)

токовый выход:

[['I', 'have'], ['have', 'I'], ['a', 'I'], ['a', 'have'], ['pen', 'have']]

Из моего понимания скип-грамма должно быть что-то вроде этого, верно? (Пожалуйста, поправьте меня, если я ошибаюсь)

Ожидаемый результат:

[['I', 'have'], ['I', 'a'], ['have', 'I'], ['have', 'a'], ['have', 'pen'], ['a', 'have'], ['a', 'I'], ['a', 'pen'],['a', 'to'],  ['pen', 'a'], ['pen', 'have'], ['pen', 'to'], ['pen', 'use'], ['to', 'pen'], ['to', 'a'],['to', 'use'], ['use', 'pen'],['use', 'to']]

Я понимаю, что изучения только одного языка программирования недостаточно, но я должен больше сосредоточиться на решении проблем. Если возможно, пожалуйста, предложите мне несколько сайтов. Спасибо.

1
JJson 19 Сен 2018 в 08:33

2 ответа

Лучший ответ

Несколько замечаний:

  • Плохая идея вызывать список-списков-строк по имени переменной 'строка'; если на самом деле здесь это вид списка-токенизированных текстов, который обычно используется в Word2Vec, то такие названия, как «предложения» или «тексты», более ясны.

  • Вы не хотите повторно перечислять lines каждый вложенный цикл, а скорее работать с текущим элементом внешнего цикла. Таким образом, цикл по sentences даст sentence. Вы бы перебрали sentence, чтобы получить каждый word.

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

  • Вам не нужно добавлять единицу к длине sentence при вырезании окна с обрезанным концом, потому что длина уже является фактическим количеством элементов, которое на единицу больше, чем последняя позиция. Но вам нужно добавить один к index + window_size, потому что операция нарезки ([x:y]) исключает второе значение ( y ).

  • Если вы действительно хотите, чтобы этот цикл обрабатывал множество текстов, возможно, вы не захотите возвращать все пары как один гигантский список пар из всех текстов. Вместо этого вы можете захотеть вернуть один список пар для каждого списка слов во входных данных.

  • Когда вы только начинаете и пытаетесь понять, полезно использовать очень информативные имена переменных и разбивать промежуточные результаты на отдельные строки в именованных переменных для ясности.

Попробуйте эту версию с минимальными изменениями, которая отражает эти изменения:

sentences = [['I', 'have', 'a', 'pen', 'to', 'use']]

window_size = 2
pairs_for_all_sentences = []

for sentence in sentences:
    this_sentence_pairs = []

    for index, target_word in enumerate(sentence): 
        window_words = sentence[max(index - window_size, 0) : min(index + window_size + 1, len(sentence))]

        for window_word in window_words:
            if window_word != target_word:
                this_sentence_pairs.append((window_word, target_word))

    pairs_for_all_sentences.append(this_sentence_pairs)

 print(pairs_for_all_sentences)

Последнее замечание: по сравнению с тем, как создаются настоящие пары скип-грамм, это не совсем так. Хотя для самого слова не создается пара, если то же слово появляется в окне, создается пара слово-слово. Таким образом, в предложении «Я очень-очень счастлив» фактически будут обучены две пары ('very', 'very').

2
gojomo 19 Сен 2018 в 17:16

используйте itertools .

from itertools import combinations

string = ['I', 'have', 'a', 'pen', 'to', 'use']
window_size = 2
print(list(combinations(string, window_size)))

< Сильный > выход:

[('I', 'have'), ('I', 'a'), ('I', 'pen'), ('I', 'to'), ('I', 'use'), ('have', 'a'), ('have', 'pen'), ('have', 'to'), ('have', 'use'), ('a', 'pen'), ('a', 'to'), ('a', 'use'), ('pen', 'to'), ('pen', 'use'), ('to', 'use')]
1
Nihal 19 Сен 2018 в 06:12