Разбор твита для извлечения хэштегов в массив в Python - PullRequest
12 голосов
/ 27 марта 2010

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

Например, «Я люблю #stackoverflow, потому что #people очень #helpful!»

Это должно потянуть 3 хэштега в массив.

Ответы [ 9 ]

55 голосов
/ 27 марта 2010

Простое регулярное выражение должно делать работу:

>>> import re
>>> s = "I love #stackoverflow because #people are very #helpful!"
>>> re.findall(r"#(\w+)", s)
['stackoverflow', 'people', 'helpful']

Обратите внимание, что, как предлагается в других ответах, это может также найти не хэштеги, такие как местоположение хеша в URL:

>>> re.findall(r"#(\w+)", "http://example.org/#comments")
['comments']

Таким образом, другое простое решение будет следующим (удаляет дубликаты в качестве бонуса):

>>> def extract_hash_tags(s):
...    return set(part[1:] for part in s.split() if part.startswith('#'))
...
>>> extract_hash_tags("#test http://example.org/#comments #test")
set(['test'])
18 голосов
/ 27 марта 2010
>>> s="I love #stackoverflow because #people are very #helpful!"
>>> [i  for i in s.split() if i.startswith("#") ]
['#stackoverflow', '#people', '#helpful!']
6 голосов
/ 27 марта 2010

Ответ AndiDogs облажается со ссылками и прочим, вы можете сначала отфильтровать их. После этого используйте этот код:

UTF_CHARS = ur'a-z0-9_\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff'
TAG_EXP = ur'(^|[^0-9A-Z&/]+)(#|\uff03)([0-9A-Z_]*[A-Z_]+[%s]*)' % UTF_CHARS
TAG_REGEX = re.compile(TAG_EXP, re.UNICODE | re.IGNORECASE)

Это может показаться излишним, но это было преобразовано отсюда http://github.com/mzsanford/twitter-text-java. Он будет обрабатывать как 99% всех хэштегов так же, как Твиттер -

Для более конвертированного регулярного выражения в Твиттере, проверьте это: http://github.com/BonsaiDen/Atarashii/blob/master/atarashii/usr/share/pyshared/atarashii/formatter.py

EDIT:
Проверить: http://github.com/BonsaiDen/AtarashiiFormat

5 голосов
/ 16 декабря 2013

Предположим, что вам нужно извлечь #Hashtags из предложения, полного символов пунктуации. Допустим, что #stackoverflow #people и #helpful оканчиваются разными символами, вы хотите извлечь их из text, но вы можете избежать повторений:

>>> text = "I love #stackoverflow, because #people... are very #helpful! Are they really #helpful??? Yes #people in #stackoverflow are really really #helpful!!!"

если вы попытаетесь использовать только set([i for i in text.split() if i.startswith("#")]), вы получите:

>>> set(['#helpful???',
 '#people',
 '#stackoverflow,',
 '#stackoverflow',
 '#helpful!!!',
 '#helpful!',
 '#people...'])

что, на мой взгляд, излишне. Лучшее решение с использованием RE с модулем re:

>>> import re
>>> set([re.sub(r"(\W+)$", "", j) for j in set([i for i in text.split() if i.startswith("#")])])
>>> set(['#people', '#helpful', '#stackoverflow'])

Теперь это нормально для меня.

РЕДАКТИРОВАТЬ: ЮНИКОД #Hashtags

Добавьте флаг re.UNICODE, если вы хотите удалить знаки пунктуации, но при этом сохранить буквы с акцентами, апострофами и прочей кодировкой Unicode, что может быть важно, если ожидается, что #Hashtags будет не только на английском языке Может быть, это всего лишь кошмар итальянского парня, а может и нет! ; -)

Например:

>>> text = u"I love #stackoverflòw, because #peoplè... are very #helpfùl! Are they really #helpfùl??? Yes #peoplè in #stackoverflòw are really really #helpfùl!!!"

будет в кодировке Unicode как:

>>> u'I love #stackoverfl\xf2w, because #peopl\xe8... are very #helpf\xf9l! Are they really #helpf\xf9l??? Yes #peopl\xe8 in #stackoverfl\xf2w are really really #helpf\xf9l!!!'

, и вы можете получить свой (правильно закодированный) #Hashtags следующим образом:

>>> set([re.sub(r"(\W+)$", "", j, flags = re.UNICODE) for j in set([i for i in text.split() if i.startswith("#")])])
>>> set([u'#stackoverfl\xf2w', u'#peopl\xe8', u'#helpf\xf9l'])

EDITx2: UNICODE #Hashtags и контроль для # повторений

Если вы хотите контролировать несколько повторений символа #, например, (извините, если пример text стал почти нечитаемым):

>>> text = u"I love ###stackoverflòw, because ##################peoplè... are very ####helpfùl! Are they really ##helpfùl??? Yes ###peoplè in ######stackoverflòw are really really ######helpfùl!!!"
>>> u'I love ###stackoverfl\xf2w, because ##################peopl\xe8... are very ####helpf\xf9l! Are they really ##helpf\xf9l??? Yes ###peopl\xe8 in ######stackoverfl\xf2w are really really ######helpf\xf9l!!!'

тогда вы должны заменить эти множественные вхождения уникальным #. Возможное решение состоит в том, чтобы ввести другое вложенное неявное определение set() с функцией sub(), заменяющей вхождения больше-1 # одним #:

>>> set([re.sub(r"#+", "#", k) for k in set([re.sub(r"(\W+)$", "", j, flags = re.UNICODE) for j in set([i for i in text.split() if i.startswith("#")])])])
>>> set([u'#stackoverfl\xf2w', u'#peopl\xe8', u'#helpf\xf9l']) 
2 голосов
/ 02 июня 2016

простой смысл (лучше, чем выбранный ответ) https://gist.github.com/mahmoud/237eb20108b5805aed5f также работать с хэштегами Unicode

1 голос
/ 11 января 2019

Лучшее Регулярное выражение хэштега Twitter :

import re
text = "#promovolt #1st # promovolt #123"
re.findall(r'\B#\w*[a-zA-Z]+\w*', text)

>>> ['#promovolt', '#1st']

enter image description here

1 голос
/ 27 марта 2010
hashtags = [word for word in tweet.split() if word[0] == "#"]
0 голосов
/ 26 июня 2018

Я извлек хэштеги глупым, но эффективным способом.

def retrive(s):
    indice_t = []
    tags = []
    tmp_str = ''
    s = s.strip()
    for i in range(len(s)):
        if s[i] == "#":
            indice_t.append(i)
    for i in range(len(indice_t)):
        index = indice_t[i]
        if i == len(indice_t)-1:
            boundary = len(s)
        else:
            boundary = indice_t[i+1]
        index += 1
        while index < boundary:
            if s[index] in "`~!@#$%^&*()-_=+[]{}|\\:;'"",.<>?/ \n\t":
                tags.append(tmp_str)
                tmp_str = ''
                break
            else:
                tmp_str += s[index]
                index += 1
        if tmp_str != '':
            tags.append(tmp_str)
    return tags
0 голосов
/ 10 сентября 2015

У меня было много проблем с языками Юникод.

я видел много способов извлечь хэштеги, но не нашел ни одного из них, отвечающих на все случаи

поэтому я написал небольшой код на python для обработки большинства случаев. у меня это работает.

def get_hashtagslist(string):
    ret = []
    s=''
    hashtag = False
    for char in string:
        if char=='#':
            hashtag = True
            if s:
                ret.append(s)
                s=''           
            continue

        # take only the prefix of the hastag in case contain one of this chars (like on:  '#happy,but i..' it will takes only 'happy'  )
        if hashtag and char in [' ','.',',','(',')',':','{','}'] and s:
            ret.append(s)
            s=''
            hashtag=False 

        if hashtag:
            s+=char

    if s:
        ret.append(s)

    return list(set([word for word in ret if len(ret)>1 and len(ret)<20]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...