Collection d'outils de texte légers, orientés vers le texte des réseaux sociaux, tels que Twitter ou Facebook, pour la tokenisation, la normalisation des mots, la segmentation des mots (pour diviser les hashtags) et la correction orthographique, en utilisant les statistiques de mots de 2 grands corpus (Wikipédia anglais, twitter - 330mil tweets anglais).
ekphrasis a été développé dans le cadre du pipeline de traitement de texte pour la soumission de l'équipe DataStories pour la tâche 4 de SemEval-2017 (anglais), Analyse des sentiments sur Twitter .
Si vous utilisez la bibliothèque dans votre projet de recherche, veuillez citer l'article « DataStories at SemEval-2017 Task 4 : Deep LSTM with Attention for Message-level and Topic-based Sentiment Analysis ».
Citation:
@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}
}
Avis de non-responsabilité : la bibliothèque n'est plus activement développée. J'essaierai de résoudre les problèmes importants, mais je ne peux faire aucune promesse.
construire à partir des sources
pip install git+git://github.com/cbaziotis/ekphrasis.git
ou installer depuis pypi
pip install ekphrasis -U
ekphrasis offre les fonctionnalités suivantes :
Tokeniseur social . Un tokenizer de texte destiné aux réseaux sociaux (Facebook, Twitter...), qui comprend les émoticônes, emojis et autres expressions non structurées complexes comme les dates, les heures et plus encore.
Segmentation des mots . Vous pouvez diviser une longue chaîne en ses mots constitutifs. Convient à la segmentation des hashtags.
Correction orthographique . Vous pouvez remplacer un mot mal orthographié par le mot candidat le plus probable.
Personnalisation . Personnalisez la segmentation des mots, la correction orthographique et l'identification des termes, en fonction de vos besoins.
Les mécanismes de segmentation de mots et de correction orthographique fonctionnent sur la base de statistiques de mots collectées à partir d'un corpus donné. Nous fournissons des statistiques de mots à partir de 2 grands corpus (de Wikipédia et Twitter), mais vous pouvez également générer des statistiques de mots à partir de votre propre corpus. Vous devrez peut-être le faire si vous travaillez avec des textes spécifiques à un domaine, comme des documents biomédicaux. Par exemple, un mot décrivant une technique ou un composé chimique peut être traité comme un mot mal orthographié, en utilisant le mot statistiques provenant d'un corpus à usage général.
ekphrasis tokenise le texte en fonction d'une liste d'expressions régulières. Vous pouvez facilement permettre à ekphrasis d'identifier de nouvelles entités, en ajoutant simplement une nouvelle entrée au dictionnaire d'expressions régulières ( ekphrasis/regexes/expressions.txt
).
Pipeline de prétraitement . Vous pouvez combiner facilement toutes les étapes ci-dessus, afin de préparer les fichiers texte de votre ensemble de données pour une sorte d'analyse ou pour l'apprentissage automatique. En plus des actions susmentionnées, vous pouvez effectuer une normalisation de texte, une annotation de mots (étiquetage) et bien plus encore.
Vous pouvez facilement définir un pipeline de prétraitement à l'aide de 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 )))
Sortir:
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>
Remarques :
ekphrasis fournit des statistiques de mots (unigrammes et bigrammes) à partir de 2 grands corpus :
Ces statistiques de mots sont nécessaires à la segmentation des mots et à la correction orthographique. De plus, vous pouvez générer des statistiques de mots à partir de votre propre corpus. Vous pouvez utiliser ekphrasis/tools/generate_stats.py
et générer des statistiques à partir d'un fichier texte ou d'un répertoire contenant une collection de fichiers texte. Par exemple, afin de générer des statistiques de mots pour text8 (http://mattmahoney.net/dc/text8.zip), vous pouvez faire :
python generate_stats.py --input text8.txt --name text8 --ngrams 2 --mincount 70 30
Après avoir exécuté le script, vous verrez un nouveau répertoire dans ekphrasis/stats/
avec les statistiques de votre corpus. Dans le cas de l'exemple ci-dessus, ekphrasis/stats/text8/
.
L'implémentation de la segmentation des mots utilise l'algorithme de Viterbi et est basée sur CH14 du livre Beautiful Data (Segaran et Hammerbacher, 2009). L'implémentation nécessite des statistiques de mots afin d'identifier et de séparer les mots dans une chaîne. Vous pouvez utiliser le mot statistiques provenant d'un des 2 corpus fournis, ou de votre propre corpus.
Exemple : Pour effectuer une segmentation de mots, vous devez d'abord instancier un segmenteur avec un corpus donné, puis simplement utiliser la méthode segment()
:
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ( corpus = "mycorpus" )
print ( seg . segment ( "smallandinsignificant" ))
Sortir:
> small and insignificant
Vous pouvez tester le résultat à l’aide des statistiques des différents 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 ()
Sortir:
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
Enfin, si le mot est camelCased ou PascalCased, alors l'algorithme divise les mots en fonction de la casse des caractères.
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ()
print ( seg . segment ( "camelCased" ))
print ( seg . segment ( "PascalCased" ))
Sortir:
> camel cased
> pascal cased
Le correcteur orthographique est basé sur le correcteur orthographique de Peter Norvig. Tout comme l'algorithme de segmentation, nous utilisons des statistiques de mots afin de trouver le candidat le plus probable. Outre les statistiques fournies, vous pouvez utiliser les vôtres.
Exemple:
Vous pouvez effectuer la correction orthographique, tout comme la segmentation des mots. Vous devez d'abord instancier un objet SpellCorrector
, qui utilise les statistiques du corpus de votre choix puis utiliser l'une des méthodes disponibles.
from ekphrasis . classes . spellcorrect import SpellCorrector
sp = SpellCorrector ( corpus = "english" )
print ( sp . correct ( "korrect" ))
Sortir:
> correct
La difficulté de la tokenisation est d'éviter de diviser des expressions ou des mots qui doivent rester intacts (en un seul jeton). Ceci est plus important dans les textes issus des réseaux sociaux, avec une écriture « créative » et des expressions comme des émoticônes, des hashtags, etc. Bien qu'il existe certains tokenizers destinés à Twitter [1], [2], qui reconnaissent le balisage Twitter et certaines expressions de sentiments de base ou de simples émoticônes, notre tokenizer est capable d'identifier presque toutes les émoticônes, emojis et de nombreuses expressions complexes.
Surtout pour des tâches telles que l'analyse des sentiments, de nombreuses expressions jouent un rôle décisif dans l'identification du sentiment exprimé dans le texte. Des expressions comme celles-ci sont :
f**k
, s**t
.a *great* time
, I don't *think* I ...
.>:(
, :))
, o/
.over-consumption
, anti-american
, mind-blowing
.De plus, les ekphrasis peuvent identifier des expressions porteuses d’informations. En fonction de la tâche, vous souhaiterez peut-être les conserver/les extraire sous la forme d'un seul jeton (IR), puis les normaliser, car ces informations peuvent ne pas être pertinentes pour la tâche (analyse des sentiments). Des expressions comme celles-ci sont :
Feb 18th
, December 2, 2016
, le 2 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
.Exemple :
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
Sortir:
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., « Marquage de parties du discours pour Twitter : annotations, fonctionnalités et expériences », dans Actes de la 49e réunion annuelle de l'Association pour la linguistique computationnelle : technologies du langage humain : articles courts-Volume 2, 2011, p. 42-47.
[2] C. Potts, « Tutoriel du Sentiment Symposium : Tokenizing », Tutoriel du Sentiment Symposium, 2011. [En ligne]. Disponible : http://sentiment.christopherpotts.net/tokenizing.html.