2016-04-06 20 views
2

Duygu analizi için Twitter verilerini analiz ediyorum ve analizlerim için tweet'leri belirtmem gerekiyor.Özel word tokenizer

bu örnek tweet olalım:

tweet = "Barça, que más veces ha jugado contra 10 en la historia https://twitter.com/7WUjZrMJah #UCL"

nltk.word_tokenize() yolunda tweet'leri sıfırlar ancak linkleri ve hashtag'lerle noktasında ayırır.

word_tokenize(tweet) 

>>> ['Bar\xc3\xa7a', ',', 'que', 'm\xc3\xa1s', 'veces', 'ha', 'jugado', 'contra', '10', 'en', 'la', 'historia', 'https', ':', '//twitter.com/7WUjZrMJah', '#', 'UCL']` 

Unicode karakterleri sağlam kalır, ancak bağlantılar bozulur. Ben olan özel bir regex dizgeciklerini, tasarladık:

Şimdi
emoticons = r'(?:[:;=\^\-oO][\-_\.]?[\)\(\]\[\-DPOp_\^\\\/])' 

regex_tweets = [ 
    emoticons, 
    r'<[^>]+>',  ## HTML TAGS 
    r'(?:@[\w\d_]+)', ## @-mentions 
    r'(?:\#[\w]+)', ## #HashTags 
    r'http[s]?://(?:[a-z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs 
    r"(?:[a-z][a-z'\-_]+[a-z])", # words with - and ' 
    r'(?:(?:\d+,?)+(?:\.?\d+)?)', ##numbers 
    r'(?:[\w_]+)', #other words 
    r'(?:\S)'  ## normal text 
] 

#compiling regex 
tokens_re = re.compile(r'('+'|'.join(regex_tweets)+')' ,re.IGNORECASE | re.VERBOSE) 
tokens_re.findall(string) 

>>> ['Bar', '\xc3', '\xa7', 'a', ',', 'que', 'm', '\xc3', '\xa1', 's', 'veces', 'ha', 'jugado', 'contra', '10', 'en', 'la', 'historia', 'https://twitter.com/7WUjZrMJah', '#UCL'] 

hashtag ve linkler onları istediğiniz şekilde görünür, ancak unicode charachters de sonları (gibi Barça ->['Bar', '\xc3', '\xa7', 'a'] yerine ['Bar\xc3\xa7a']

arasında Ben her iki entegre bir yolu var mı bu ?? Ya da gelen TweetTokenizer çalıştık ??

unicode karakterleri içeren bir düzenli ifade nltk.tokenize kütüphanesi, ama çok kullanışlı değildi.

+0

Ayrıca 're.U' işaretini de belirtmeniz gerekir. re.IGNORECASE | re.VERBOSE | re.UNICODE'. Ayrıca, [\ w \ d _] + '=' \ w + 'olduğunu unutmayın. Ayrıca, bu '(?: (?: \ D + ,?) + (?: \.? \ D +)?)' Kırılgan görünüyor. –

+0

@ WiktorStribiż bunu yaptı, ama hiçbir şey değişmedi. – Krishh

+0

@ WiktorStribiżew Düzenli ifadeleri daha sonra optimize edip onları daha sağlam hale getirmek için kullanacağım, normal ifadeler şimdilik iyi çalışıyor, unicode kelimeleri yakalamam gerekiyor. – Krishh

cevap

0

Dizeyi bir unicode dizesi olarak bildirirseniz, unicode karakterlerinin çoğunun kesilmediğini ortaya çıkar. Hala birçok kelimeyi kırar, ancak performans daha iyi.

# coding=utf-8 

tweet = u"Barça, que más veces ha jugado contra 10 en la historia https://twitter.com/7WUjZrMJah #UCL" 

emoticons = r'(?:[:;=\^\-oO][\-_\.]?[\)\(\]\[\-DPOp_\^\\\/])' 

regex_tweets = [ 
    emoticons, 
    r'<[^>]+>',  ## HTML TAGS 
    r'(?:@[\w\d_]+)', ## @-mentions 
    r'(?:\#[\w]+)', ## #HashTags 
    r'http[s]?://(?:[a-z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+', # URLs 
    r"(?:[a-z][a-z'\-_]+[a-z])", # words with - and ' 
    r'(?:(?:\d+,?)+(?:\.?\d+)?)', ##numbers 
    r'(?:[\w_]+)', #other words 
    r'(?:\S)'  ## normal text 
] 

#compiling regex 
tokens_re = re.compile(r'('+'|'.join(regex_tweets)+')' ,re.IGNORECASE | re.VERBOSE) 
tokens_re.findall(string) 

>>>[u'Bar', u'\xe7a', u',', u'que', u'm\xe1s', u'veces', u'ha', u'jugado', u'contra', u'10', u'en', u'la', u'historia', u'https://twitter.com/7WUjZrMJah', u'#UCL'] 

Hala hala orijinal vadeli ['Bar\xc3\xa7a'] değil ['Bar', '\xc3', '\xa7', 'a'] daha iyidir, ama [u'Bar', u'\xe7a'] e Barça tokenised. Ancak pek çok ifadede çalışır.