Для работы вашей функции 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']