Sammlung leichter Textwerkzeuge, die auf Text aus sozialen Netzwerken wie Twitter oder Facebook ausgerichtet sind, zur Tokenisierung, Wortnormalisierung, Wortsegmentierung (zum Aufteilen von Hashtags) und Rechtschreibkorrektur unter Verwendung von Wortstatistiken aus zwei großen Korpora (englische Wikipedia, Twitter – 330 Millionen). englische Tweets).
ekphrasis wurde als Teil der Textverarbeitungspipeline für die Einreichung des DataStories- Teams für SemEval-2017 Aufgabe 4 (Englisch), Stimmungsanalyse in Twitter , entwickelt.
Wenn Sie die Bibliothek in Ihrem Forschungsprojekt nutzen, zitieren Sie bitte den Artikel „DataStories at SemEval-2017 Task 4: Deep LSTM with Attention for Message-level and Topic-based Sentiment Analysis“.
Zitat:
@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}
}
Haftungsausschluss: Die Bibliothek wird nicht mehr aktiv weiterentwickelt. Ich werde versuchen, wichtige Probleme zu lösen, kann aber keine Versprechungen machen.
aus dem Quellcode erstellen
pip install git+git://github.com/cbaziotis/ekphrasis.git
oder von Pypi installieren
pip install ekphrasis -U
ekphrasis bietet folgende Funktionalität:
Sozialer Tokenizer . Ein auf soziale Netzwerke (Facebook, Twitter...) ausgerichteter Text-Tokenizer, der komplexe Emoticons, Emojis und andere unstrukturierte Ausdrücke wie Datum, Uhrzeit und mehr versteht.
Wortsegmentierung . Sie können eine lange Zeichenfolge in ihre einzelnen Wörter aufteilen. Geeignet für die Hashtag-Segmentierung.
Rechtschreibkorrektur . Sie können ein falsch geschriebenes Wort durch das wahrscheinlichste Kandidatenwort ersetzen.
Anpassung . Passen Sie die Wortsegmentierung, Rechtschreibkorrektur und Begriffsidentifizierung an Ihre Bedürfnisse an.
Mechanismen zur Wortsegmentierung und Rechtschreibkorrektur basieren auf Wortstatistiken, die aus einem bestimmten Korpus erfasst werden. Wir bieten Wortstatistiken aus zwei großen Korpora (von Wikipedia und Twitter), Sie können aber auch Wortstatistiken aus Ihrem eigenen Korpus erstellen. Dies kann erforderlich sein, wenn Sie mit domänenspezifischen Texten arbeiten, beispielsweise mit biomedizinischen Dokumenten. Beispielsweise kann ein Wort, das eine Technik oder eine chemische Verbindung beschreibt, als falsch geschriebenes Wort behandelt werden, indem die Wortstatistik eines allgemeinen Korpus verwendet wird.
ekphrasis tokenisiert den Text basierend auf einer Liste regulärer Ausdrücke. Sie können ekphrasis ganz einfach aktivieren, um neue Entitäten zu identifizieren, indem Sie einfach einen neuen Eintrag zum Wörterbuch der regulären Ausdrücke hinzufügen ( ekphrasis/regexes/expressions.txt
).
Vorverarbeitungspipeline . Sie können alle oben genannten Schritte auf einfache Weise kombinieren, um die Textdateien in Ihrem Datensatz für eine Analyse oder für maschinelles Lernen vorzubereiten. Zusätzlich zu den oben genannten Aktionen können Sie Textnormalisierung, Wortanmerkung (Beschriftung) und mehr durchführen.
Mit TextPreProcessor
können Sie ganz einfach eine Vorverarbeitungspipeline definieren.
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 )))
Ausgabe:
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>
Hinweise:
ekphrasis bietet Wortstatistiken (Unigramme und Bigramme) aus zwei großen Korpora:
Diese Wortstatistiken werden für die Wortsegmentierung und Rechtschreibkorrektur benötigt. Darüber hinaus können Sie Wortstatistiken aus Ihrem eigenen Korpus erstellen. Sie können ekphrasis/tools/generate_stats.py
verwenden und Statistiken aus einer Textdatei oder einem Verzeichnis generieren, das eine Sammlung von Textdateien enthält. Um beispielsweise Wortstatistiken für text8 (http://mattmahoney.net/dc/text8.zip) zu erstellen, können Sie Folgendes tun:
python generate_stats.py --input text8.txt --name text8 --ngrams 2 --mincount 70 30
Nachdem Sie das Skript ausgeführt haben, sehen Sie in ekphrasis/stats/
ein neues Verzeichnis mit den Statistiken Ihres Korpus. Im Fall des obigen Beispiels ekphrasis/stats/text8/
.
Die Wortsegmentierungsimplementierung verwendet den Viterbi-Algorithmus und basiert auf CH14 aus dem Buch Beautiful Data (Segaran und Hammerbacher, 2009). Die Implementierung erfordert Wortstatistiken, um die Wörter in einer Zeichenfolge zu identifizieren und zu trennen. Sie können die Wortstatistiken aus einem der beiden bereitgestellten Korpora oder aus Ihrem eigenen Korpus verwenden.
Beispiel: Um eine Wortsegmentierung durchzuführen, müssen Sie zunächst einen Segmentierer mit einem bestimmten Korpus instanziieren und dann einfach die segment()
-Methode verwenden:
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ( corpus = "mycorpus" )
print ( seg . segment ( "smallandinsignificant" ))
Ausgabe:
> small and insignificant
Sie können die Ausgabe anhand von Statistiken aus den verschiedenen Korpora testen:
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 ()
Ausgabe:
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
Wenn das Wort schließlich „camelCased“ oder „PascalCased“ ist, teilt der Algorithmus die Wörter basierend auf der Groß-/Kleinschreibung der Zeichen auf.
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ()
print ( seg . segment ( "camelCased" ))
print ( seg . segment ( "PascalCased" ))
Ausgabe:
> camel cased
> pascal cased
Der Spell Corrector basiert auf Peter Norvigs Spell-Corrector. Genau wie der Segmentierungsalgorithmus nutzen wir Wortstatistiken, um den wahrscheinlichsten Kandidaten zu finden. Neben den bereitgestellten Statistiken können Sie auch Ihre eigenen verwenden.
Beispiel:
Sie können die Rechtschreibkorrektur ebenso durchführen wie die Wortsegmentierung. Zuerst müssen Sie ein SpellCorrector
Objekt instanziieren, das die Statistiken aus dem Korpus Ihrer Wahl verwendet, und dann eine der verfügbaren Methoden verwenden.
from ekphrasis . classes . spellcorrect import SpellCorrector
sp = SpellCorrector ( corpus = "english" )
print ( sp . correct ( "korrect" ))
Ausgabe:
> correct
Die Schwierigkeit bei der Tokenisierung besteht darin, die Aufspaltung von Ausdrücken oder Wörtern zu vermeiden, die intakt bleiben sollten (als ein Token). Dies ist bei Texten aus sozialen Netzwerken wichtiger, mit „kreativem“ Schreiben und Ausdrücken wie Emoticons, Hashtags usw. Obwohl es einige auf Twitter ausgerichtete Tokenizer gibt [1],[2], die das Twitter-Markup und einige grundlegende Stimmungsausdrücke oder einfache Emoticons erkennen, ist unser Tokenizer in der Lage, fast alle Emoticons, Emojis und viele komplexe Ausdrücke zu identifizieren.
Insbesondere bei Aufgaben wie der Stimmungsanalyse gibt es viele Ausdrücke, die eine entscheidende Rolle bei der Identifizierung der im Text ausgedrückten Stimmung spielen. Ausdrücke wie diese sind:
f**k
, s**t
.a *great* time
, I don't *think* I ...
.>:(
, :))
, o/
.over-consumption
, anti-american
, mind-blowing
.Darüber hinaus kann Ekphrasis informationstragende Ausdrücke identifizieren. Abhängig von der Aufgabe möchten Sie sie möglicherweise als ein Token (IR) beibehalten/extrahieren und sie dann normalisieren, da diese Informationen für die Aufgabe (Stimmungsanalyse) möglicherweise irrelevant sind. Ausdrücke wie diese sind:
Feb 18th
, December 2, 2016
, 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
.Beispiel :
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
Ausgabe:
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., „Part-of-speech tagging for twitter: Annotation, Features, and Experiments“, in Proceedings of the 49th Annual Meeting of the Association for Computational Linguistics: Human Language Technologies: Short Papers – Band 2, 2011, S. 42–47.
[2] C. Potts, „Sentiment Symposium Tutorial: Tokenizing“, Sentiment Symposium Tutorial, 2011. [Online]. Verfügbar: http://sentiment.christopherpotts.net/tokenizing.html.