Как извлечь слова из списка списков и отфильтровать слова по длине? - PullRequest
0 голосов
/ 14 июня 2019

В основном я хочу сделать две вещи, используя python: 1) Сделайте результирующий список списком слов, а не списком списков, и 2) Отфильтруйте слова длиной 1 символ.


Мне нужно извлечь слова из списка словарей, сделать слова строчными и отфильтровать слова так, чтобы в результирующий список входили только слова, длина которых превышает 1. Я должен использовать map () и понимание списка, но я не знаю, как это сделать. Мне также пришлось использовать re.spilt (), чтобы разбить слова на части и избавиться от нежелательной пунктуации.

До сих пор я был в состоянии извлечь соответствующие части списка словарей, разделив слова вверх и сделав все слова строчными. Но я получаю список списков, элементами которых являются слова.

Я хочу, чтобы результатом был просто список слов длиной не более 2 символов.

def extract_tweets(some_list):
    tweetlist = []
    for each_tweet in some_list:
        text = each_tweet['text']
        lowercase = text.lower()
        tweetlist.append(lowercase)
    tweetwords = []
    for words in tweetlist:
        word = re.split('\W+', words)
        tweetwords.append(word)
    return(tweetwords)

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Для работы вашей функции extract_tweets требуется список словарей в качестве аргумента. Так что some_list выглядит примерно так:

some_list = [
    {
        'text': "Hello world!"
    },
    {
        'text': "The sun is shinning, the sky is blue."
    },
]

На самом деле, первый цикл извлекает тексты, поэтому лучше назвать его тексты или text_list (вместо tweetlist ). Вы получаете:

['hello world!', 'the sun is shinning, the sky is blue.']

Чтобы извлечь слова из текста, лучше использовать findall вместо split, потому что с split вы можете иметь пустые строки, если текст начинается или заканчивается не словом, как в мои примеры.

Чтобы найти все слова текста, вы можете использовать:

words = re.findall('\w+', text)

примечание: \w+ RegEx также будет захватывать цифры и подчеркивания. Чтобы избежать этого, вы должны использовать отрицательный класс [^\W\d_]+.

Результат findall представляет собой список слов. Чтобы отфильтровать слово, длина которого больше 1, вы можете использовать filter с функцией или список понимания с условием:

words = list(filter(lambda w: len(w) > 1, words))
# or:
words = [w for w in words if len(w) > 1]

Вот переработанный код:

import re
import pprint


def extract_tweets(some_list):
    texts = []
    for each_tweet in some_list:
        text = each_tweet['text']
        lowercase = text.lower()
        texts.append(lowercase)
    tweet_words = []
    for text in texts:
        words = re.findall('[^\W\d_]+', text)
        words = [w for w in words if len(w) > 1]
        tweet_words.append(words)
    return tweet_words

В следующем примере…

some_list = [
    {
        'text': "Hello world!"
    },
    {
        'text': "The sun is shinning, the sky is blue."
    },
    {
        'text': "1, 2, 3, four"
    },
    {
        'text': "not a word"
    },
]

pprint.pprint(extract_tweets(some_list))

… вы получите:

[['hello', 'world'],
 ['the', 'sun', 'is', 'shinning', 'the', 'sky', 'is', 'blue'],
 ['four'],
 ['not', 'word']]

С extend вместо append вы получите:

['hello',
 'world',
 'the',
 'sun',
 'is',
 'shinning',
 'the',
 'sky',
 'is',
 'blue',
 'four',
 'not',
 'word']
0 голосов
/ 14 июня 2019

Простое понимание списка поможет вам в этом:

tweetwords = [word for word in tweetwords if len(word) > 1]
...