Kumpulan alat teks ringan, ditujukan untuk teks dari jejaring sosial, seperti Twitter atau Facebook, untuk tokenisasi, normalisasi kata, segmentasi kata (untuk memisahkan hashtag) dan koreksi ejaan, menggunakan statistik kata dari 2 corpora besar (Wikipedia bahasa Inggris, twitter - 330mil tweet bahasa Inggris).
ekphrasis dikembangkan sebagai bagian dari alur pemrosesan teks untuk pengajuan tim DataStories untuk SemEval-2017 Tugas 4 (Bahasa Inggris), Analisis Sentimen di Twitter .
Jika Anda menggunakan perpustakaan dalam proyek penelitian Anda, silakan kutip makalah "DataStories di SemEval-2017 Tugas 4: LSTM Mendalam dengan Perhatian pada Analisis Sentimen Tingkat Pesan dan Berbasis Topik".
Kutipan:
@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}
}
Penafian: Perpustakaan tidak lagi dikembangkan secara aktif. Saya akan mencoba menyelesaikan masalah penting, tapi saya tidak bisa berjanji.
membangun dari sumber
pip install git+git://github.com/cbaziotis/ekphrasis.git
atau instal dari pypi
pip install ekphrasis -U
ekphrasis menawarkan fungsi berikut:
Tokenisasi Sosial . Tokenizer teks yang ditujukan untuk jejaring sosial (Facebook, Twitter...), yang memahami emotikon kompleks, emoji, dan ekspresi tidak terstruktur lainnya seperti tanggal, waktu, dan banyak lagi.
Segmentasi Kata . Anda dapat membagi string panjang menjadi kata-kata penyusunnya. Cocok untuk segmentasi hashtag.
Koreksi Ejaan . Anda dapat mengganti kata yang salah eja dengan kandidat kata yang paling mungkin.
Kustomisasi . Taylor segmentasi kata, koreksi ejaan, dan identifikasi istilah, sesuai dengan kebutuhan Anda.
Mekanisme Segmentasi Kata dan Koreksi Ejaan, beroperasi di atas statistik kata, yang dikumpulkan dari korpus tertentu. Kami menyediakan statistik kata dari 2 korpus besar (dari Wikipedia dan Twitter), namun Anda juga dapat membuat statistik kata dari korpus Anda sendiri. Anda mungkin perlu melakukan itu jika Anda bekerja dengan teks khusus domain, seperti dokumen biomedis. Misalnya, kata yang mendeskripsikan suatu teknik atau senyawa kimia dapat dianggap sebagai kata yang salah eja, menggunakan kata statistik dari korpus yang bertujuan umum.
ekphrasis memberi token pada teks berdasarkan daftar ekspresi reguler. Anda dapat dengan mudah mengaktifkan ekphrasis untuk mengidentifikasi entitas baru, hanya dengan menambahkan entri baru ke kamus ekspresi reguler ( ekphrasis/regexes/expressions.txt
).
Pipa Pra-Pemrosesan . Anda dapat menggabungkan semua langkah di atas dengan cara yang mudah, untuk menyiapkan file teks dalam kumpulan data Anda untuk beberapa jenis analisis atau untuk pembelajaran mesin. Selain tindakan di atas, Anda dapat melakukan normalisasi teks, anotasi kata (pelabelan), dan banyak lagi.
Anda dapat dengan mudah menentukan alur prapemrosesan dengan menggunakan 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 )))
Keluaran:
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>
Catatan:
ekphrasis menyediakan statistik kata (unigram dan bigram) dari 2 korpora besar:
Statistik kata ini diperlukan untuk segmentasi kata dan koreksi ejaan. Selain itu, Anda dapat menghasilkan statistik kata dari korpus Anda sendiri. Anda dapat menggunakan ekphrasis/tools/generate_stats.py
dan menghasilkan statistik dari file teks, atau direktori yang berisi kumpulan file teks. Misalnya, untuk menghasilkan statistik kata untuk text8 (http://mattmahoney.net/dc/text8.zip), Anda dapat melakukan:
python generate_stats.py --input text8.txt --name text8 --ngrams 2 --mincount 70 30
Setelah Anda menjalankan skrip, Anda akan melihat direktori baru di dalam ekphrasis/stats/
dengan statistik korpus Anda. Dalam kasus contoh di atas, ekphrasis/stats/text8/
.
Implementasi segmentasi kata menggunakan algoritma Viterbi dan berdasarkan CH14 dari buku Beautiful Data (Segaran dan Hammerbacher, 2009). Implementasinya memerlukan statistik kata untuk mengidentifikasi dan memisahkan kata-kata dalam sebuah string. Anda bisa menggunakan kata statistik dari salah satu dari 2 korpus yang disediakan, atau dari korpus Anda sendiri.
Contoh: Untuk melakukan segmentasi kata, pertama-tama Anda harus membuat instance segmenter dengan korpus tertentu, lalu gunakan metode segment()
:
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ( corpus = "mycorpus" )
print ( seg . segment ( "smallandinsignificant" ))
Keluaran:
> small and insignificant
Anda dapat menguji keluaran menggunakan statistik dari berbagai 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 ()
Keluaran:
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
Terakhir, jika kata tersebut camelCased atau PascalCased, maka algoritme akan membagi kata berdasarkan huruf besar/kecil karakternya.
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ()
print ( seg . segment ( "camelCased" ))
print ( seg . segment ( "PascalCased" ))
Keluaran:
> camel cased
> pascal cased
Korektor Ejaan didasarkan pada korektor ejaan Peter Norvig. Sama seperti algoritma segmentasi, kami menggunakan statistik kata untuk menemukan kandidat yang paling mungkin. Selain statistik yang disediakan, Anda dapat menggunakan statistik Anda sendiri.
Contoh:
Anda dapat melakukan koreksi ejaan, seperti segmentasi kata. Pertama, Anda harus membuat instance objek SpellCorrector
, yang menggunakan statistik dari korpus pilihan Anda dan kemudian menggunakan metode yang tersedia.
from ekphrasis . classes . spellcorrect import SpellCorrector
sp = SpellCorrector ( corpus = "english" )
print ( sp . correct ( "korrect" ))
Keluaran:
> correct
Kesulitan dalam tokenisasi adalah untuk menghindari pemisahan ekspresi atau kata-kata yang harus tetap utuh (sebagai satu token). Hal ini lebih penting dalam teks dari jejaring sosial, dengan tulisan dan ekspresi "kreatif" seperti emotikon, tagar, dan sebagainya. Meskipun ada beberapa tokenizer yang ditujukan untuk Twitter [1],[2], yang mengenali markup Twitter dan beberapa ekspresi sentimen dasar atau emotikon sederhana, tokenizer kami mampu mengidentifikasi hampir semua emotikon, emoji, dan banyak ekspresi kompleks.
Khusus untuk tugas-tugas seperti analisis sentimen, ada banyak ekspresi yang memainkan peran penting dalam mengidentifikasi sentimen yang diungkapkan dalam teks. Ekspresi seperti ini adalah:
f**k
, s**t
.a *great* time
, I don't *think* I ...
.>:(
, :))
, o/
.over-consumption
, anti-american
, mind-blowing
.Selain itu, ekphrasis dapat mengidentifikasi ekspresi yang mengandung informasi. Bergantung pada tugasnya, Anda mungkin ingin tetap menyimpan/mengekstraksinya sebagai satu token (IR) dan kemudian menormalkannya karena informasi ini mungkin tidak relevan untuk tugas tersebut (analisis sentimen). Ekspresi seperti ini adalah:
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
.Contoh :
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
Keluaran:
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., “Penandaan part-of-speech untuk twitter: Anotasi, fitur, dan eksperimen,” dalam Prosiding Pertemuan Tahunan ke-49 Asosiasi Linguistik Komputasi: Teknologi Bahasa Manusia: makalah pendek-Volume 2, 2011, hlm.42–47.
[2] C. Potts, “Tutorial Simposium Sentimen: Tokenisasi,” Tutorial Simposium Sentimen, 2011. [Online]. Tersedia: http://sentiment.christopherpotts.net/tokenizing.html.