Разбиение списка на подсписки по заданному разделителю в python - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь построить n-грамм, которые не пересекают символ периода.Split () работает только для функций, а list [index] работает только с индексом.Есть ли способ получить / разделить / разделить список, дав ему строку / элемент?Вот фрагмент моей текущей функции:

text = ["split","this","stuff",".","my","dear"]

def generate_ngram(rawlist, ngram_order):
        """
        Input: List of words or characters, ngram-order ["this", "is", "an", "example"], 2
        Output: Set of tuples or words or characters {("this", "is"),("is","an"),...}
        """

    list_of_tuples = []
    for i in range(0, len(rawlist) - ngram_order + 1):
        ngram_order_index = i + ngram_order    
        generated_ngram = rawlist[i : ngram_order_index]

        #if "." in generated_ngram:
            #generated_ngram . . . 

        generated_tuple = tuple(generated_ngram)  
        list_of_tuples.append(generated_tuple)

    return set(list_of_tuples)

generate_ngram(text,3)

в настоящее время возвращает:

{('.', 'my', 'dear'),
 ('stuff', '.', 'my'),
 ('split', 'this', 'stuff'),
 ('this', 'stuff', '.')}

, но в идеале должно возвращаться:

{('split', 'this', 'stuff'),
 ('this', 'stuff', '.')}

Любая идея о том, какдостичь этого?Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 26 февраля 2019

Я не уверен, что это именно то, что вам нужно, но эта функция генерирует нграммы, которые могут содержать только стоп-слова (в данном случае период) в конце:

STOPWORDS = {"."}

def generate_ngram(rawlist, ngram_order):
    # All ngrams
    ngrams = zip(*(rawlist[i:] for i in range(ngram_order)))
    # Generate only those ngrams that do not contain stop words before the end
    return (ngram for ngram in ngrams if not any(w in STOPWORDS for w in ngram[:-1]))

text = ["split", "this", "stuff", ".", "my", "dear"]
print(*generate_ngram(text, 3), sep="\n")
# ('split', 'this', 'stuff')
# ('this', 'stuff', '.')
print(*generate_ngram(text, 2), sep="\n")
# ('split', 'this')
# ('this', 'stuff')
# ('stuff', '.')
# ('my', 'dear')

Обратите внимание, эта функция возвращаетгенератор.Вы можете преобразовать его в список, заключив его в list(...), если хотите, или можете напрямую перебрать его.

РЕДАКТИРОВАТЬ: эквивалентный синтаксис ниже может оказаться более читабельным.

def generate_ngram(rawlist, ngram_order):
    # Iterate over all ngrams
    for ngram in zip(*(rawlist[i:] for i in range(ngram_order))):
        # Yield only those not containing stop words before the end
        if not any(w in STOPWORDS for w in ngram[:-1]):
            yield ngram
...