Удаление пунктуации из моего вложенного и токенизированного списка - PullRequest
0 голосов
/ 31 октября 2018

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

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']]

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Чтобы это работало как есть, вам нужно запустить 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))

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

0 голосов
/ 31 октября 2018

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

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']]

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

result = [[token for token in sentence if token not in string.punctuation] for sentence in sentences]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...