Coleção de ferramentas de texto leve, voltadas para textos de redes sociais, como Twitter ou Facebook, para tokenização, normalização de palavras, segmentação de palavras (para divisão de hashtags) e correção ortográfica, usando estatísticas de palavras de 2 grandes corpora (Wikipedia inglês, twitter - 330mil tweets em inglês).
ekphrasis foi desenvolvido como parte do pipeline de processamento de texto para envio da equipe DataStories para SemEval-2017 Task 4 (Inglês), Análise de Sentimento no Twitter .
Se você usar a biblioteca em seu projeto de pesquisa, cite o artigo "DataStories at SemEval-2017 Task 4: Deep LSTM with Attention for Message-level and Topic-based Sentiment Analysis".
Citação:
@InProceedings{baziotis-pelekis-doulkeridis:2017:SemEval2,
author = {Baziotis, Christos and Pelekis, Nikos and Doulkeridis, Christos},
title = {DataStories at SemEval-2017 Task 4: Deep LSTM with Attention for Message-level and Topic-based Sentiment Analysis},
booktitle = {Proceedings of the 11th International Workshop on Semantic Evaluation (SemEval-2017)},
month = {August},
year = {2017},
address = {Vancouver, Canada},
publisher = {Association for Computational Linguistics},
pages = {747--754}
}
Isenção de responsabilidade: a biblioteca não está mais desenvolvida ativamente. Tentarei resolver questões importantes, mas não posso fazer promessas.
construir a partir da fonte
pip install git+git://github.com/cbaziotis/ekphrasis.git
ou instale a partir do pypi
pip install ekphrasis -U
ekphrasis oferece a seguinte funcionalidade:
Tokenizador Social . Um tokenizer de texto voltado para redes sociais (Facebook, Twitter...), que entende emoticons complexos, emojis e outras expressões não estruturadas como datas, horários e muito mais.
Segmentação de palavras . Você pode dividir uma string longa em suas palavras constituintes. Adequado para segmentação de hashtag.
Correção ortográfica . Você pode substituir uma palavra com erro ortográfico pela palavra candidata mais provável.
Personalização . Personalize a segmentação de palavras, a correção ortográfica e a identificação de termos, para atender às suas necessidades.
Os mecanismos de segmentação de palavras e correção ortográfica operam sobre estatísticas de palavras coletadas de um determinado corpus. Fornecemos estatísticas de palavras de dois grandes corpora (da Wikipedia e do Twitter), mas você também pode gerar estatísticas de palavras a partir de seu próprio corpus. Talvez seja necessário fazer isso se estiver trabalhando com textos de domínios específicos, como documentos biomédicos. Por exemplo, uma palavra que descreve uma técnica ou um composto químico pode ser tratada como uma palavra escrita incorretamente, usando a palavra estatística de um corpus de uso geral.
ekphrasis tokeniza o texto com base em uma lista de expressões regulares. Você pode facilmente habilitar o ekphrasis para identificar novas entidades, simplesmente adicionando uma nova entrada ao dicionário de expressões regulares ( ekphrasis/regexes/expressions.txt
).
Pipeline de pré-processamento . Você pode combinar todas as etapas acima de uma forma fácil, a fim de preparar os arquivos de texto do seu conjunto de dados para algum tipo de análise ou para aprendizado de máquina. Além das ações citadas, você pode realizar normalização de texto, anotação de palavras (rotulagem) e muito mais.
Você pode definir facilmente um pipeline de pré-processamento usando TextPreProcessor
.
from ekphrasis . classes . preprocessor import TextPreProcessor
from ekphrasis . classes . tokenizer import SocialTokenizer
from ekphrasis . dicts . emoticons import emoticons
text_processor = TextPreProcessor (
# terms that will be normalized
normalize = [ 'url' , 'email' , 'percent' , 'money' , 'phone' , 'user' ,
'time' , 'url' , 'date' , 'number' ],
# terms that will be annotated
annotate = { "hashtag" , "allcaps" , "elongated" , "repeated" ,
'emphasis' , 'censored' },
fix_html = True , # fix HTML tokens
# corpus from which the word statistics are going to be used
# for word segmentation
segmenter = "twitter" ,
# corpus from which the word statistics are going to be used
# for spell correction
corrector = "twitter" ,
unpack_hashtags = True , # perform word segmentation on hashtags
unpack_contractions = True , # Unpack contractions (can't -> can not)
spell_correct_elong = False , # spell correction for elongated words
# select a tokenizer. You can use SocialTokenizer, or pass your own
# the tokenizer, should take as input a string and return a list of tokens
tokenizer = SocialTokenizer ( lowercase = True ). tokenize ,
# list of dictionaries, for replacing tokens extracted from the text,
# with other expressions. You can pass more than one dictionaries.
dicts = [ emoticons ]
)
sentences = [
"CANT WAIT for the new season of #TwinPeaks \(^o^)/!!! #davidlynch #tvseries :)))" ,
"I saw the new #johndoe movie and it suuuuucks!!! WAISTED $10... #badmovies :/" ,
"@SentimentSymp: can't wait for the Nov 9 #Sentiment talks! YAAAAAAY !!! :-D http://sentimentsymposium.com/."
]
for s in sentences :
print ( " " . join ( text_processor . pre_process_doc ( s )))
Saída:
cant <allcaps> wait <allcaps> for the new season of <hashtag> twin peaks </hashtag> \(^o^)/ ! <repeated> <hashtag> david lynch </hashtag> <hashtag> tv series </hashtag> <happy>
i saw the new <hashtag> john doe </hashtag> movie and it sucks <elongated> ! <repeated> waisted <allcaps> <money> . <repeated> <hashtag> bad movies </hashtag> <annoyed>
<user> : can not wait for the <date> <hashtag> sentiment </hashtag> talks ! yay <allcaps> <elongated> ! <repeated> <laugh> <url>
Notas:
ekphrasis fornece estatísticas de palavras (unigramas e bigramas) de 2 grandes corpora:
Essas estatísticas de palavras são necessárias para a segmentação de palavras e correção ortográfica. Além disso, você pode gerar estatísticas de palavras a partir de seu próprio corpus. Você pode usar ekphrasis/tools/generate_stats.py
e gerar estatísticas a partir de um arquivo de texto ou de um diretório que contenha uma coleção de arquivos de texto. Por exemplo, para gerar estatísticas de palavras para text8 (http://mattmahoney.net/dc/text8.zip), você pode fazer:
python generate_stats.py --input text8.txt --name text8 --ngrams 2 --mincount 70 30
Após executar o script, você verá um novo diretório dentro de ekphrasis/stats/
com as estatísticas do seu corpus. No caso do exemplo acima, ekphrasis/stats/text8/
.
A implementação da segmentação de palavras usa o algoritmo de Viterbi e é baseada no CH14 do livro Beautiful Data (Segaran e Hammerbacher, 2009). A implementação requer estatísticas de palavras para identificar e separar as palavras em uma string. Você pode usar a palavra estatística de um dos dois corpora fornecidos ou do seu próprio corpus.
Exemplo: Para realizar a segmentação de palavras, primeiro é necessário instanciar um segmentador com um determinado corpus, e depois basta utilizar o método segment()
:
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ( corpus = "mycorpus" )
print ( seg . segment ( "smallandinsignificant" ))
Saída:
> small and insignificant
Você pode testar o resultado usando estatísticas de diferentes corpora:
from ekphrasis . classes . segmenter import Segmenter
# segmenter using the word statistics from english Wikipedia
seg_eng = Segmenter ( corpus = "english" )
# segmenter using the word statistics from Twitter
seg_tw = Segmenter ( corpus = "twitter" )
words = [ "exponentialbackoff" , "gamedev" , "retrogaming" , "thewatercooler" , "panpsychism" ]
for w in words :
print ( w )
print ( "(eng):" , seg_eng . segment ( w ))
print ( "(tw):" , seg_tw . segment ( w ))
print ()
Saída:
exponentialbackoff
(eng): exponential backoff
(tw): exponential back off
gamedev
(eng): gamedev
(tw): game dev
retrogaming
(eng): retrogaming
(tw): retro gaming
thewatercooler
(eng): the water cooler
(tw): the watercooler
panpsychism
(eng): panpsychism
(tw): pan psych is m
Finalmente, se a palavra for camelCased ou PascalCased, o algoritmo divide as palavras com base na caixa dos caracteres.
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ()
print ( seg . segment ( "camelCased" ))
print ( seg . segment ( "PascalCased" ))
Saída:
> camel cased
> pascal cased
O corretor ortográfico é baseado no corretor ortográfico de Peter Norvig. Assim como o algoritmo de segmentação, utilizamos estatísticas de palavras para encontrar o candidato mais provável. Além das estatísticas fornecidas, você pode usar as suas próprias.
Exemplo:
Você pode realizar a correção ortográfica, assim como a segmentação de palavras. Primeiro você deve instanciar um objeto SpellCorrector
, que utiliza as estatísticas do corpus de sua escolha e depois utilizar um dos métodos disponíveis.
from ekphrasis . classes . spellcorrect import SpellCorrector
sp = SpellCorrector ( corpus = "english" )
print ( sp . correct ( "korrect" ))
Saída:
> correct
A dificuldade na tokenização é evitar a divisão de expressões ou palavras que deveriam ser mantidas intactas (como um token). Isso é mais importante em textos de redes sociais, com escrita “criativa” e expressões como emoticons, hashtags e assim por diante. Embora existam alguns tokenizers voltados para o Twitter [1],[2], que reconhecem a marcação do Twitter e algumas expressões de sentimento básicas ou emoticons simples, nosso tokenizer é capaz de identificar quase todos os emoticons, emojis e muitas expressões complexas.
Especialmente para tarefas como análise de sentimento, existem muitas expressões que desempenham um papel decisivo na identificação do sentimento expresso no texto. Expressões como estas são:
f**k
, s**t
.a *great* time
, I don't *think* I ...
>:(
, :))
, o/
.over-consumption
, anti-american
, mind-blowing
.Além disso, a ekphrasis pode identificar expressões que contêm informações. Dependendo da tarefa, você pode querer preservá-los/extraí-los como um token (IR) e depois normalizá-los, pois essas informações podem ser irrelevantes para a tarefa (análise de sentimento). Expressões como estas são:
Feb 18th
, December 2, 2016
, December 2-2016
, 10/17/94
, 3 December 2016
, April 25, 1995
, 11.15.16
, November 24th 2016
, January 21st
.5:45pm
, 11:36 AM
, 2:45 pm
, 5:30
.$220M
, $2B
, $65.000
, €10
, $50K
.http://www.cs.unipi.gr
, https://t.co/Wfw5Z1iSEt
.Exemplo :
import nltk
from ekphrasis . classes . tokenizer import SocialTokenizer
def wsp_tokenizer ( text ):
return text . split ( " " )
puncttok = nltk . WordPunctTokenizer (). tokenize
social_tokenizer = SocialTokenizer ( lowercase = False ). tokenize
sents = [
"CANT WAIT for the new season of #TwinPeaks \(^o^)/ yaaaay!!! #davidlynch #tvseries :)))" ,
"I saw the new #johndoe movie and it suuuuucks!!! WAISTED $10... #badmovies >3:/" ,
"@SentimentSymp: can't wait for the Nov 9 #Sentiment talks! YAAAAAAY !!! >:-D http://sentimentsymposium.com/." ,
]
for s in sents :
print ()
print ( "ORG: " , s ) # original sentence
print ( "WSP : " , wsp_tokenizer ( s )) # whitespace tokenizer
print ( "WPU : " , puncttok ( s )) # WordPunct tokenizer
print ( "SC : " , social_tokenizer ( s )) # social tokenizer
Saída:
ORG: CANT WAIT for the new season of #TwinPeaks \(^o^)/ yaaaay!!! #davidlynch #tvseries :)))
WSP : ['CANT', 'WAIT', 'for', 'the', 'new', 'season', 'of', '#TwinPeaks', '\(^o^)/', 'yaaaay!!!', '#davidlynch', '#tvseries', ':)))']
WPU : ['CANT', 'WAIT', 'for', 'the', 'new', 'season', 'of', '#', 'TwinPeaks', '\(^', 'o', '^)/', 'yaaaay', '!!!', '#', 'davidlynch', '#', 'tvseries', ':)))']
SC : ['CANT', 'WAIT', 'for', 'the', 'new', 'season', 'of', '#TwinPeaks', '\(^o^)/', 'yaaaay', '!', '!', '!', '#davidlynch', '#tvseries', ':)))']
ORG: I saw the new #johndoe movie and it suuuuucks!!! WAISTED $10... #badmovies >3:/
WSP : ['I', 'saw', 'the', 'new', '#johndoe', 'movie', 'and', 'it', 'suuuuucks!!!', 'WAISTED', '$10...', '#badmovies', '>3:/']
WPU : ['I', 'saw', 'the', 'new', '#', 'johndoe', 'movie', 'and', 'it', 'suuuuucks', '!!!', 'WAISTED', '$', '10', '...', '#', 'badmovies', '>', '3', ':/']
SC : ['I', 'saw', 'the', 'new', '#johndoe', 'movie', 'and', 'it', 'suuuuucks', '!', '!', '!', 'WAISTED', '$10', '.', '.', '.', '#badmovies', '>', '3:/']
[1] K. Gimpel et al., “Tagagem de parte da fala para Twitter: anotação, recursos e experimentos”, em Anais da 49ª Reunião Anual da Associação de Linguística Computacional: Tecnologias de Linguagem Humana: artigos curtos-Volume 2, 2011, pp.
[2] C. Potts, “Tutorial do Simpósio de Sentimentos: Tokenização”, Tutorial do Simpósio de Sentimentos, 2011. [Online]. Disponível: http://sentiment.christopherpotts.net/tokenizing.html.