Как создать окно / чанк для списка предложений?

У меня есть список предложений, и я хочу создать скипграмму (window size = 3), но я, НЕ, хочу, чтобы счетчик охватывал предложения, поскольку все они не связаны.

Итак, если у меня есть предложения:

[["my name is John"] , ["This PC is black"]]

тройняшки будут:

[my name is]
[name is john]
[this PC is]
[PC is black]

Как лучше всего это сделать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
143
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот простая функция для этого.

def skipgram(corpus, window_size = 3):
    sg = []
    for sent in corpus:
        sent = sent[0].split()
        if len(sent) <= window_size:
            sg.append(sent)
        else:
            for i in range(0, len(sent)-window_size+1):
                sg.append(sent[i: i+window_size])
    return sg

corpus = [["my name is John"] , ["This PC is black"]]
skipgram(corups)

Спасибо за ваш ответ. Вы знаете, как можно изменить этот код, чтобы включить счетчик для каждого из выходов?

bernando_vialli 09.07.2019 17:45
Ответ принят как подходящий

Попробуй это!

from nltk import ngrams

def generate_ngrams(sentences,window_size =3):
    for sentence in sentences:
        yield from ngrams(sentence[0].split(), window_size)

sentences= [["my name is John"] , ["This PC is black"]]

for c in generate_ngrams(sentences,3):
    print (c)

#output:
('my', 'name', 'is')
('name', 'is', 'John')
('This', 'PC', 'is')
('PC', 'is', 'black')

Благодарность! Учитывая триграмму, есть ли хорошая реализация функции loss_ для word2vec?

oren_isp 26.12.2018 09:16

@ai_learning, знаете ли вы, почему, когда я запускаю его, он ничего не распечатывает, а только выдает сообщение «DeprecationWarning generator 'ngrams' подняло StopIteration». Я могу проигнорировать сообщение, но оно по-прежнему ничего не выводит при выполнении кода.

bernando_vialli 09.07.2019 17:50

Звучит интересно. Не могли бы вы добавить больше деталей и задать это как отдельный вопрос.

Venkatachalam 09.07.2019 20:08

Вам действительно не нужен skipgram как таковой, но вам нужен кусок по размеру, попробуйте следующее:

from lazyme import per_chunk

tokens = "my name is John".split()
list(per_chunk(tokens, 2))

[вне]:

[('my', 'name'), ('is', 'John')]

Если вам нужно скользящее окно, например ngrams:

from lazyme import per_window

tokens = "my name is John".split()
list(per_window(tokens, 2))

[вне]:

[('my', 'name'), ('name', 'is'), ('is', 'John')]

Аналогично в NLTK для нграмм:

from nltk import ngrams

tokens = "my name is John".split()
list(ngrams(tokens, 2))

[вне]:

[('my', 'name'), ('name', 'is'), ('is', 'John')]

Если вам нужны настоящие скипграммы, Как вычислить скипграммы в Python?

from nltk import skipgrams

tokens = "my name is John".split()
list(skipgrams(tokens, n=2, k=1))

[вне]:

[('my', 'name'),
 ('my', 'is'),
 ('name', 'is'),
 ('name', 'John'),
 ('is', 'John')]

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