Удаление знаков препинания из моего вложенного и токенизированного списка

Я пытаюсь удалить знаки препинания из моего вложенного и токенизированного списка. Я пробовал несколько разных подходов к этому, но безрезультатно. Моя последняя попытка выглядит так:

def tokenizeNestedList(listToTokenize):
    flat_list = [item.lower() for sublist in paragraphs_no_guten for item in sublist]
    tokenList = []
    for sentence in flat_list:
        sentence.translate(str.maketrans(",",string.punctuation))
        tokenList.append(nltk.word_tokenize(sentence))
    return tokenList

Как вы можете видеть, я пытаюсь удалить знаки препинания, поскольку я токенизирую список, список просматривается кем угодно при вызове моей функции. Однако при использовании этого подхода я получаю сообщение об ошибке

ValueError: the first two maketrans arguments must have equal length

Что я как бы понимаю, почему так происходит. Выполнение моего кода без попытки удалить знаки препинания и печать первых 10 элементов дает мне (так что вы имеете представление о том, над чем я работаю) следующее:

[[], ['title', ':', 'an', 'inquiry', 'into', 'the', 'nature', 'and', 'causes', 'of', 'the', 'wealth', 'of', 'nations'], ['author', ':', 'adam', 'smith'], ['posting', 'date', ':', 'february', '28', ',', '2009', '[', 'ebook', '#', '3300', ']'], ['release', 'date', ':', 'april', ',', '2002'], ['[', 'last', 'updated', ':', 'june', '5', ',', '2011', ']'], ['language', ':', 'english'], [], [], ['produced', 'by', 'colin', 'muir']]

Любые советы приветствуются.

1
0
750
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагая, что каждая пунктуация представляет собой отдельный токен, вы можете сделать что-то вроде этого:

import string

sentences = [[], ['title', ':', 'an', 'inquiry', 'into', 'the', 'nature', 'and', 'causes', 'of', 'the', 'wealth', 'of',
             'nations'], ['author', ':', 'adam', 'smith'],
             ['posting', 'date', ':', 'february', '28', ',', '2009', '[', 'ebook', '#', '3300', ']'],
             ['release', 'date', ':', 'april', ',', '2002'], ['[', 'last', 'updated', ':', 'june', '5', ',', '2011', ']'],
             ['language', ':', 'english'], [], [], ['produced', 'by', 'colin', 'muir']]


result = [list(filter(lambda x: x not in string.punctuation, sentence)) for sentence in sentences]

print(result)

Выход

[[], ['title', 'an', 'inquiry', 'into', 'the', 'nature', 'and', 'causes', 'of', 'the', 'wealth', 'of', 'nations'], ['author', 'adam', 'smith'], ['posting', 'date', 'february', '28', '2009', 'ebook', '3300'], ['release', 'date', 'april', '2002'], ['last', 'updated', 'june', '5', '2011'], ['language', 'english'], [], [], ['produced', 'by', 'colin', 'muir']]

Идея состоит в том, чтобы использовать фильтр, чтобы удалить те токены, которые являются знаками пунктуации, поскольку фильтр возвращает список использования итератора, чтобы преобразовать его обратно в список. Вы также можете использовать эквивалентное понимание списка:

result = [[token for token in sentence if token not in string.punctuation] for sentence in sentences]

Это сделал то, что я хотел. Спасибо! Я добавил фильтр к методу listcomprehension, чтобы получить именно то, что я хотел. Для всех, кто прочтет это позже, я наложил на него фильтр, чтобы удалить пробелы: result = list (filter (None, result))

UndisclosedCurtain 31.10.2018 16:06
Ответ принят как подходящий

Чтобы это работало как есть, вам нужно запустить Python 3.x. Кроме того, b содержит пример вложенного списка, который вы предоставили

import string
# Remove empty lists
b = [x for x in b if x]
# Make flat list
b = [x for sbl in b for x in sbl]
# Define translation
translator = str.maketrans('', '', string.punctuation)
# Apply translation
b = [x.translate(translator) for x in b]
# Remove empty strings
b = list(filter(None, b))

Ссылка, почему это не работало раньше: Функция maketrans () Python 2 не работает с Unicode: «аргументы имеют разную длину», хотя на самом деле

Это делает почти то, что я хочу. Есть ли способ отменить сглаживание списка? Мне нужно сохранить слова в списках, которые я определил ранее.

UndisclosedCurtain 31.10.2018 15:48

Попробуйте: b = [x for x in b if x] # Define translation translator = str.maketrans('', '', string.punctuation) # Apply translation b = [[word.translate(translator) for word in sbl] for sbl in b] # Remove empty strings b = [list(filter(None, sbl)) for sbl in b]

Konstantin Grigorov 31.10.2018 16:42

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