Colección de herramientas de texto ligeras, orientadas a texto de redes sociales, como Twitter o Facebook, para tokenización, normalización de palabras, segmentación de palabras (para dividir hashtags) y corrección ortográfica, utilizando estadísticas de palabras de 2 grandes corpus (Wikipedia en inglés, twitter - 330mil tuits en inglés).
ekphrasis se desarrolló como parte del proceso de procesamiento de texto para el envío del equipo de DataStories para la Tarea 4 (inglés) de SemEval-2017, Análisis de sentimiento en Twitter .
Si utiliza la biblioteca en su proyecto de investigación, cite el artículo "DataStories at SemEval-2017 Tarea 4: LSTM profundo con atención al análisis de sentimiento basado en temas y a nivel de mensajes".
Citación:
@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}
}
Descargo de responsabilidad: la biblioteca ya no se desarrolla activamente. Intentaré resolver cuestiones importantes, pero no puedo hacer ninguna promesa.
construir desde la fuente
pip install git+git://github.com/cbaziotis/ekphrasis.git
o instalar desde pypi
pip install ekphrasis -U
ekphrasis ofrece la siguiente funcionalidad:
Tokenizador social . Un tokenizador de texto orientado a redes sociales (Facebook, Twitter...), que entiende emoticonos complejos, emojis y otras expresiones no estructuradas como fechas, horas y más.
Segmentación de palabras . Puede dividir una cadena larga en las palabras que la constituyen. Adecuado para la segmentación de hashtags.
Corrección ortográfica . Puede reemplazar una palabra mal escrita con la palabra candidata más probable.
Personalización . Adapte la segmentación de palabras, la corrección ortográfica y la identificación de términos a sus necesidades.
Los mecanismos de segmentación de palabras y corrección ortográfica funcionan sobre las estadísticas de palabras, recopiladas de un corpus determinado. Proporcionamos estadísticas de palabras de 2 grandes corpus (de Wikipedia y Twitter), pero también puede generar estadísticas de palabras a partir de su propio corpus. Es posible que tengas que hacerlo si estás trabajando con textos de un dominio específico, como documentos biomédicos. Por ejemplo, una palabra que describe una técnica o un compuesto químico puede tratarse como una palabra mal escrita, utilizando la palabra estadística de un corpus de propósito general.
ekphrasis tokeniza el texto basándose en una lista de expresiones regulares. Puede habilitar fácilmente la ekphrasis para identificar nuevas entidades, simplemente agregando una nueva entrada al diccionario de expresiones regulares ( ekphrasis/regexes/expressions.txt
).
Tubería de preprocesamiento . Puede combinar todos los pasos anteriores de una manera sencilla para preparar los archivos de texto en su conjunto de datos para algún tipo de análisis o aprendizaje automático. Además de las acciones antes mencionadas, podrás realizar normalización de texto, anotación de palabras (etiquetado) y más.
Puede definir fácilmente una canalización de preprocesamiento utilizando 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 )))
Producción:
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:
La écfrasis proporciona estadísticas de palabras (unigramas y bigramas) de 2 grandes corpus:
Estas estadísticas de palabras son necesarias para la segmentación de palabras y la corrección ortográfica. Además, puedes generar estadísticas de palabras a partir de tu propio corpus. Puede usar ekphrasis/tools/generate_stats.py
y generar estadísticas a partir de un archivo de texto o un directorio que contenga una colección de archivos de texto. Por ejemplo, para generar estadísticas de palabras para text8 (http://mattmahoney.net/dc/text8.zip), puede hacer:
python generate_stats.py --input text8.txt --name text8 --ngrams 2 --mincount 70 30
Después de ejecutar el script, verá un nuevo directorio dentro de ekphrasis/stats/
con las estadísticas de su corpus. En el caso del ejemplo anterior, ekphrasis/stats/text8/
.
La implementación de la segmentación de palabras utiliza el algoritmo de Viterbi y se basa en el CH14 del libro Beautiful Data (Segaran y Hammerbacher, 2009). La implementación requiere estadísticas de palabras para identificar y separar las palabras en una cadena. Puede utilizar la palabra estadística de uno de los 2 corpus proporcionados o de su propio corpus.
Ejemplo: para realizar la segmentación de palabras, primero debe crear una instancia de un segmentador con un corpus determinado y luego simplemente usar el método segment()
:
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ( corpus = "mycorpus" )
print ( seg . segment ( "smallandinsignificant" ))
Producción:
> small and insignificant
Puede probar el resultado utilizando estadísticas de los diferentes corpus:
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 ()
Producción:
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, si la palabra es camelCased o PascalCased, entonces el algoritmo divide las palabras según el caso de los caracteres.
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ()
print ( seg . segment ( "camelCased" ))
print ( seg . segment ( "PascalCased" ))
Producción:
> camel cased
> pascal cased
El corrector ortográfico se basa en el corrector ortográfico de Peter Norvig. Al igual que el algoritmo de segmentación, utilizamos estadísticas de palabras para encontrar el candidato más probable. Además de las estadísticas proporcionadas, puedes utilizar las tuyas propias.
Ejemplo:
Puedes realizar la corrección ortográfica, al igual que la segmentación de palabras. Primero debe crear una instancia de un objeto SpellCorrector
, que usa las estadísticas del corpus de su elección y luego usar uno de los métodos disponibles.
from ekphrasis . classes . spellcorrect import SpellCorrector
sp = SpellCorrector ( corpus = "english" )
print ( sp . correct ( "korrect" ))
Producción:
> correct
La dificultad de la tokenización es evitar dividir expresiones o palabras que deben mantenerse intactas (como una sola ficha). Esto es más importante en los textos de las redes sociales, con escrituras y expresiones "creativas" como emoticonos, hashtags, etc. Aunque existen algunos tokenizadores orientados a Twitter [1],[2], que reconocen el marcado de Twitter y algunas expresiones de sentimiento básicas o emoticones simples, nuestro tokenizador es capaz de identificar casi todos los emoticones, emojis y muchas expresiones complejas.
Especialmente para tareas como el análisis de sentimientos, hay muchas expresiones que juegan un papel decisivo a la hora de identificar el sentimiento expresado en el texto. Expresiones como estas son:
f**k
, s**t
.a *great* time
, I don't *think* I ...
.>:(
, :))
, o/
.over-consumption
, anti-american
, mind-blowing
.Además, la écfrasis puede identificar expresiones que contienen información. Dependiendo de la tarea, es posible que desee conservarlos/extraerlos como un token (IR) y luego normalizarlos, ya que esta información puede ser irrelevante para la tarea (análisis de sentimiento). Expresiones como estas son:
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
.Ejemplo :
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
Producción:
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., “Etiquetado de parte del discurso para Twitter: anotación, características y experimentos”, en Actas de la 49.ª reunión anual de la Asociación de Lingüística Computacional: Tecnologías del lenguaje humano: artículos breves, volumen 2, 2011, págs. 42–47.
[2] C. Potts, “Tutorial del Simposio sobre sentimientos: tokenización”, Tutorial del Simposio sobre sentimientos, 2011. [En línea]. Disponible: http://sentiment.christopherpotts.net/tokenizing.html.