مجموعة من الأدوات النصية خفيفة الوزن، موجهة نحو النص من الشبكات الاجتماعية، مثل Twitter أو Facebook، للترميز، وتطبيع الكلمات، وتجزئة الكلمات (لتقسيم علامات التصنيف) وتصحيح الإملاء، باستخدام إحصائيات الكلمات من مجموعتين كبيرتين (ويكيبيديا الإنجليزية، تويتر - 330 مليون تغريدات باللغة الإنجليزية).
تم تطوير ekphrasis كجزء من مسار معالجة النصوص لتقديم فريق DataStories لمهمة SemEval-2017 4 (الإنجليزية)، تحليل المشاعر في Twitter .
إذا كنت تستخدم المكتبة في مشروعك البحثي، فيرجى الاستشهاد بالمقالة "DataStories at SemEval-2017 Task 4: Deep LSTM مع الاهتمام بتحليل المشاعر على مستوى الرسالة والموضوع".
الاقتباس:
@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}
}
إخلاء المسؤولية: لم تعد المكتبة قيد التطوير بشكل نشط. سأحاول حل القضايا المهمة، لكن لا يمكنني تقديم أي وعود.
بناء من المصدر
pip install git+git://github.com/cbaziotis/ekphrasis.git
أو التثبيت من pypi
pip install ekphrasis -U
يقدم ekphrasis الوظائف التالية:
رمز اجتماعي . أداة رمزية نصية موجهة نحو شبكات التواصل الاجتماعي (Facebook، Twitter...)، والتي تفهم الرموز التعبيرية المعقدة والرموز التعبيرية وغيرها من التعبيرات غير المنظمة مثل التواريخ والأوقات والمزيد.
تجزئة الكلمة . يمكنك تقسيم سلسلة طويلة إلى الكلمات المكونة لها. مناسبة لتجزئة الهاشتاج.
التصحيح الإملائي . يمكنك استبدال الكلمة التي بها أخطاء إملائية، بالكلمة المرشحة الأكثر احتمالاً.
التخصيص . تايلور تجزئة الكلمات والتصحيح الإملائي وتحديد المصطلحات بما يناسب احتياجاتك.
تعمل آليات تجزئة الكلمات والتصحيح الإملائي على رأس إحصائيات الكلمات التي يتم جمعها من مجموعة معينة. نحن نقدم إحصائيات الكلمات من مجموعتين كبيرتين (من ويكيبيديا وتويتر)، ولكن يمكنك أيضًا إنشاء إحصائيات الكلمات من مجموعتك الخاصة. قد تحتاج إلى القيام بذلك إذا كنت تعمل مع نصوص خاصة بمجال معين، مثل المستندات الطبية الحيوية. على سبيل المثال، قد يتم التعامل مع كلمة تصف تقنية أو مركب كيميائي على أنها كلمة بها أخطاء إملائية، وذلك باستخدام كلمة إحصائيات من مجموعة الأغراض العامة.
يقوم ekphrasis بترميز النص بناءً على قائمة التعبيرات العادية. يمكنك بسهولة تمكين ekphrasis لتحديد الكيانات الجديدة، وذلك ببساطة عن طريق إضافة إدخال جديد إلى قاموس التعبيرات العادية ( ekphrasis/regexes/expressions.txt
).
خط أنابيب ما قبل المعالجة . يمكنك الجمع بين جميع الخطوات المذكورة أعلاه بطريقة سهلة، من أجل إعداد الملفات النصية في مجموعة البيانات الخاصة بك لنوع ما من التحليل أو للتعلم الآلي. بالإضافة إلى الإجراءات المذكورة أعلاه، يمكنك تنفيذ تطبيع النص والتعليق التوضيحي للكلمات (وضع العلامات) والمزيد.
يمكنك بسهولة تحديد مسار المعالجة المسبقة، باستخدام 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 )))
الإخراج:
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>
ملحوظات:
يوفر ekphrasis إحصائيات الكلمات (الأحادية والكبيرة) من مجموعتين كبيرتين:
إحصائيات الكلمات هذه مطلوبة لتجزئة الكلمات وتصحيح الإملاء. علاوة على ذلك، يمكنك إنشاء إحصائيات الكلمات من مجموعتك الخاصة. يمكنك استخدام ekphrasis/tools/generate_stats.py
وإنشاء إحصائيات من ملف نصي، أو دليل يحتوي على مجموعة من الملفات النصية. على سبيل المثال، من أجل إنشاء إحصائيات الكلمات للنص 8 (http://mattmahoney.net/dc/text8.zip)، يمكنك القيام بما يلي:
python generate_stats.py --input text8.txt --name text8 --ngrams 2 --mincount 70 30
بعد تشغيل البرنامج النصي، سترى دليلاً جديدًا داخل ekphrasis/stats/
يحتوي على إحصائيات مجموعتك. في حالة المثال أعلاه، ekphrasis/stats/text8/
.
يستخدم تنفيذ تجزئة الكلمات خوارزمية Viterbi ويعتمد على CH14 من كتاب البيانات الجميلة (Segaran and Hammerbacher, 2009). يتطلب التنفيذ إحصائيات الكلمات من أجل تحديد الكلمات وفصلها في السلسلة. يمكنك استخدام إحصائيات الكلمات من إحدى المجموعتين المقدمتين، أو من مجموعتك الخاصة.
على سبيل المثال: من أجل إجراء تجزئة الكلمات، عليك أولاً إنشاء مثيل للمُجزئ باستخدام مجموعة محددة، ثم استخدم طريقة segment()
فقط:
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ( corpus = "mycorpus" )
print ( seg . segment ( "smallandinsignificant" ))
الإخراج:
> small and insignificant
يمكنك اختبار الإخراج باستخدام إحصائيات من مجموعات مختلفة:
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 ()
الإخراج:
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
أخيرًا، إذا كانت الكلمة CamelCased أو PascalCased، تقوم الخوارزمية بتقسيم الكلمات بناءً على حالة الأحرف.
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ()
print ( seg . segment ( "camelCased" ))
print ( seg . segment ( "PascalCased" ))
الإخراج:
> camel cased
> pascal cased
يعتمد مصحح الإملاء على المصحح الإملائي لبيتر نورفيج. تمامًا مثل خوارزمية التجزئة، نستخدم إحصائيات الكلمات للعثور على المرشح الأكثر احتمالاً. بالإضافة إلى الإحصائيات المقدمة، يمكنك استخدام الإحصائيات الخاصة بك.
مثال:
يمكنك إجراء التصحيح الإملائي، تمامًا مثل تجزئة الكلمات. يجب عليك أولاً إنشاء كائن SpellCorrector
، الذي يستخدم الإحصائيات من المجموعة التي تختارها ثم استخدام إحدى الطرق المتاحة.
from ekphrasis . classes . spellcorrect import SpellCorrector
sp = SpellCorrector ( corpus = "english" )
print ( sp . correct ( "korrect" ))
الإخراج:
> correct
تكمن صعوبة الترميز في تجنب تقسيم التعبيرات أو الكلمات التي يجب أن تظل سليمة (كرمز واحد). وهذا أكثر أهمية في النصوص الواردة من شبكات التواصل الاجتماعي، التي تحتوي على كتابات وتعبيرات "إبداعية" مثل الرموز التعبيرية وعلامات التصنيف وما إلى ذلك. على الرغم من وجود بعض الرموز المميزة الموجهة نحو تويتر [1]،[2]، والتي تتعرف على ترميز تويتر وبعض تعبيرات المشاعر الأساسية أو الرموز التعبيرية البسيطة، إلا أن برنامج الرموز المميزة الخاص بنا قادر على تحديد جميع الرموز والرموز التعبيرية والعديد من التعبيرات المعقدة تقريبًا.
خاصة بالنسبة لمهام مثل تحليل المشاعر، هناك العديد من التعبيرات التي تلعب دورًا حاسمًا في تحديد المشاعر المعبر عنها في النص. مثل هذه التعبيرات هي:
f**k
, s**t
.a *great* time
، I don't *think* I ...
.>:(
, :))
، o/
.over-consumption
، anti-american
، mind-blowing
.علاوة على ذلك، يمكن لـ ekphrasis تحديد التعبيرات التي تحمل المعلومات. اعتمادًا على المهمة، قد ترغب في الاحتفاظ بها/استخراجها كرمز مميز واحد (IR) ثم تطبيعها نظرًا لأن هذه المعلومات قد لا تكون ذات صلة بالمهمة (تحليل المشاعر). مثل هذه التعبيرات هي:
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
.مثال :
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
الإخراج:
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] ك. جيمبل وآخرون، "وضع علامات على جزء من الكلام في تويتر: التعليقات التوضيحية والميزات والتجارب"، في وقائع الاجتماع السنوي التاسع والأربعين لجمعية اللغويات الحاسوبية: تقنيات اللغة البشرية: أوراق قصيرة - المجلد. 2، 2011، ص 42-47.
[2] سي. بوتس، "البرنامج التعليمي لندوة المشاعر: الرمزية"، البرنامج التعليمي لندوة المشاعر، 2011. [عبر الإنترنت]. متاح: http://sentiment.christopherpotts.net/tokenizing.html.