Коллекция облегченных текстовых инструментов, ориентированных на текст из социальных сетей, таких как Twitter или Facebook, для токенизации, нормализации слов, сегментации слов (для разделения хэштегов) и исправления орфографии с использованием статистики слов из двух больших корпусов (английская Википедия, Twitter - 330 миллионов). английские твиты).
ekphrasis был разработан как часть конвейера обработки текста для отправки командой DataStories задачи 4 SemEval-2017 (на английском языке), «Анализ настроений» в Twitter .
Если вы используете библиотеку в своем исследовательском проекте, цитируйте статью «DataStories на SemEval-2017, задача 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
и генерировать статистику из текстового файла или каталога, содержащего коллекцию текстовых файлов. Например, чтобы сгенерировать статистику слов для text8 (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/
.
Реализация сегментации слов использует алгоритм Витерби и основана на CH14 из книги Beautiful Data (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
Наконец, если слово имеет верблюжий регистр или 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
Трудность токенизации состоит в том, чтобы избежать разделения выражений или слов, которые должны быть сохранены в целости и сохранности (как один токен). Это более важно в текстах из социальных сетей, с «креативным» написанием и такими выражениями, как смайлы, хештеги и так далее. Хотя существуют некоторые токенизаторы, ориентированные на Twitter [1],[2], которые распознают разметку Twitter и некоторые основные выражения чувств или простые смайлы, наш токенизатор способен идентифицировать почти все смайлы, эмодзи и многие сложные выражения.
Существует множество выражений, которые играют решающую роль в определении настроения, выраженного в тексте, особенно для таких задач, как анализ настроений. Подобные выражения:
f**k
, s**t
.a *great* time
, I don't *think* I ...
.>:(
, :))
, o/
.over-consumption
, anti-american
, mind-blowing
.Кроме того, экфрасис может идентифицировать выражения, несущие информацию. В зависимости от задачи вы можете сохранить/извлечь их как один токен (IR), а затем нормализовать, поскольку эта информация может быть нерелевантной для задачи (анализ настроений). Подобные выражения:
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
.Пример :
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] К. Гимпель и др., «Теги частей речи для Твиттера: аннотации, особенности и эксперименты», в материалах 49-го ежегодного собрания Ассоциации компьютерной лингвистики: технологии человеческого языка: короткие статьи — том. 2, 2011, стр. 42–47.
[2] К. Поттс, «Учебное пособие по симпозиуму по настроениям: токенизация», Учебное пособие по симпозиуму по настроениям, 2011 г. [Онлайн]. Доступно: http://sentiment.christopherpotts.net/tokenizing.html.