Поиск последнего слова в tweedy tweet response python

backwardslagoon спросил: 13 июня 2018 в 08:02 в: python

Я получаю поток твитов с помощью python и хотел бы извлечь последнее слово или узнать, где его ссылать.

для пример в

NC не нравится работать вместе www.linktowtweet.org

вернуться

 together

2 ответа

Есть решение
The Matt ответил: 14 июня 2018 в 04:32

Я не знаком с tweepy, поэтому я предполагаю, что у вас есть данные в строке python, поэтому, возможно, есть лучший ответ.

Однако, учитывая строку в python, ее просто извлечь последнее слово.

Решение 1

Используйте str.rfind(' '). Идея здесь состоит в том, чтобы найти пространство, предшествующее последнему слову. Вот пример.

text = "NC don’t like working together"
text = text.rstrip() # To any spaces at the end, that would otherwise confuse the algorithm.
last_word = text[text.rfind(' ')+1:] # Output every character *after* the space.
print(last_word)

Примечание. Если строка задана без слов, last_word будет пустой строкой.

Теперь это предполагает, что все слова разделены пробелами. Для обработки строк и пробелов используйте str.replace, чтобы превратить их в строки. Пробелы в python - это \t\n\x0b\x0c\r, но я предполагаю, что только новые строки и вкладки будут найдены в сообщениях Twitter.

Также см .: string.whitespace

Таким образом, полный пример (завернутый как функция) будет

def last_word(text):
    text = text.replace('\n', ' ') # Replace newlines with spaces.
    text = text.replace('\t', ' ') # Replace tabs with spaces.
    text = text.rstrip(' ') # Remove trailing spaces.
    return text[text.rfind(' ')+1:]print(last_word("NC don’t like working together")) # Outputs "together".

Это может быть наилучшей ситуацией для базового анализа. Для более серьезных проблем есть что-то лучшее.

Решение 2

Регулярные выражения

Это способ обработки строк в python, это намного более гибко. REGEX, как их часто называют, использует собственный язык для указания части текста.

Например, .*\s(\S+) указывает последнее слово в строке.

Вот еще раз с более длинным объяснением.

.*               # Match as many characters as possible.
\s               # Until a whitespace ("\t\n\x0b\x0c\r ")
(                # Remember the next section for the answer.
\S+              # Match a ~word~ (not whitespace) as possible.
)                # End saved section.

Итак, в python вы использовали бы это следующим образом.

import re # Import the REGEX library.# Compile the code, (DOTALL makes . match \n).
LAST_WORD_PATTERN = re.compile(r".*\s(\S+)", re.DOTALL) def last_word(text):
    m = LAST_WORD_PATTERN.match(text)
    if not m: # If there was not a last word to this text.
        return ''
    return m.group(1) # Otherwise return the last word.print(last_word("NC don’t like working together")) # Outputs "together".

Теперь, хотя этот метод намного менее очевидный, он имеет несколько преимуществ. Во-первых, это намного более настраиваемый. Если вы хотите совместить последнее слово, но не ссылки, регулярное выражение r".*\s([^.:\s]+(?!\.\S|://))\b" будет соответствовать последнему слову, но игнорировать ссылку, если это последнее.

Пример:

import re # Import the REGEX library.# Compile the code, (DOTALL makes . match \n).
LAST_WORD_PATTERN = re.compile(r".*\s([^.:\s]+(?!\.\S|://))\b", re.DOTALL)def last_word(text):
    m = LAST_WORD_PATTERN.match(text)
    if not m: # If there was not a last word to this text.
        return ''
    return m.group(1) # Otherwise return the last word.print(last_word("NC don’t like working together www.linktowtweet.org")) # Outputs "together".

Второе преимущество этого метода - скорость.

Как вы можете попробовать это онлайн! здесь подход с регулярным выражением почти так же быстро, как и манипулирование строками, если не быстрее в некоторых случаях. (Я действительно обнаружил, что регулярное выражение выполняет .2 usec быстрее на моей машине, что в демо.)

В любом случае выполнение регулярного выражения выполняется очень быстро, даже в простом случае, и нет сомнений в том, что regex быстрее, чем любой более сложный строковый алгоритм, реализованный в python. Таким образом, использование регулярного выражения также может ускорить выполнение кода.


ИЗМЕНИТЬ Изменен URL-адрес, исключающий регулярное выражение от

re.compile(r".*\s([^.\s]+(?!\.\S))\b", re.DOTALL)

до

re.compile(r".*\s([^.:\s]+(?!\.\S|://))\b", re.DOTALL)

Так что вызов last_word("NC don’t like working together http://www.linktowtweet.org") возвращает together, а не http://.

To как работает это регулярное выражение, посмотрите https://regex101.com/r/sdwpqB/2.

backwardslagoon ответил: 13 июня 2018 в 12:49
Это потрясающий ответ с большими объяснениями, большое вам спасибо, я уверен, что это сработает
satya ответил: 13 июня 2018 в 02:15

Простой, поэтому, если ваш текст:

text = "NC don’t like working together www.linktowtweet.org"
text = re.sub(r'https?:\/\/.*[\r\n]*', '', text, flags=re.MULTILINE) #to remove any URL
text = text.split() #splits sentence into words with delimiter=" "
last_word = text[-1]

Итак, вы идете! Теперь вы получите последнее слово "вместе".

The Matt ответил: 14 июня 2018 в 03:42
На самом деле, это решение не работает для меня. Я получаю "www.linktowtweet.org" в качестве вывода. Кажется, что регулярное выражение предполагает, что все URL-адреса начинаются с "http" и сбой, если они этого не делают. Я понимаю, что мне нужно изменить свой код, чтобы обрабатывать случай HTTP.

Дополнительное видео по вопросу: Поиск последнего слова в tweedy tweet response python

Twitter API with Python: Part 1 -- Streaming Live Tweets

Day 29: Twitter API with Python

Tweet Visualization and Sentiment Analysis in Python - Full Tutorial