轻量级文本工具集合,针对来自 Twitter 或 Facebook 等社交网络的文本,使用 2 个大型语料库(英语维基百科、twitter - 3.3 亿)的单词统计数据进行标记化、单词标准化、分词(用于分割主题标签)和拼写纠正英文推文)。
ekphrasis是作为DataStories团队提交的SemEval-2017 任务 4(英语)“Twitter 中的情绪分析”的文本处理管道的一部分而开发的。
如果您在研究项目中使用该库,请引用论文“DataStories at SemEval-2017 Task 4: Deep LSTM with Attention for Message-level and Topic-based Sentiment Analysis”。
引用:
@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...)的文本标记器,它可以理解复杂的表情符号、表情符号和其他非结构化表达,例如日期、时间等。
分词。您可以将长字符串拆分为其组成词。适用于主题标签分割。
拼写更正。您可以用最可能的候选单词替换拼写错误的单词。
定制。 Taylor 提供分词、拼写纠正和术语识别功能,以满足您的需求。
单词分割和拼写纠正机制基于从给定语料库收集的单词统计数据进行操作。我们提供来自 2 大语料库(来自维基百科和 Twitter)的单词统计信息,但您也可以从您自己的语料库生成单词统计信息。如果您正在处理特定领域的文本(例如生物医学文档),您可能需要这样做。例如,使用来自通用语料库的单词统计数据,描述技术或化学化合物的单词可以被视为拼写错误的单词。
ekphrasis根据正则表达式列表对文本进行标记。您只需将新条目添加到正则表达式字典 ( ekphrasis/regexes/expressions.txt
) 中,即可轻松启用ekphrasis来识别新实体。
预处理管道。您可以以简单的方式组合上述所有步骤,以便准备数据集中的文本文件以进行某种分析或机器学习。此外,除了上述操作之外,您还可以执行文本规范化、单词注释(标签)等。
您可以使用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提供来自 2 个大语料库的单词统计信息(一元词组和二元词组):
这些单词统计数据是分词和拼写纠正所需要的。此外,您可以从自己的语料库生成单词统计数据。您可以使用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/
。
分词实现使用 Viterbi 算法,基于《Beautiful Data》(Segaran 和 Hammerbacher,2009)一书中的 CH14。该实现需要单词统计,以便识别和分隔字符串中的单词。您可以使用提供的 2 个语料库之一或您自己的语料库中的“统计”一词。
示例:为了执行分词,首先必须使用给定的语料库实例化一个分词器,然后只需使用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
最后,如果单词是驼峰命名法或帕斯卡命名法,那么算法会根据字符的大小写来分割单词。
from ekphrasis . classes . segmenter import Segmenter
seg = Segmenter ()
print ( seg . segment ( "camelCased" ))
print ( seg . segment ( "PascalCased" ))
输出:
> camel cased
> pascal cased
拼写校正器基于 Peter Norvig 的拼写校正器。就像分段算法一样,我们利用单词统计来找到最可能的候选者。除了提供的统计数据之外,您还可以使用自己的统计数据。
例子:
您可以执行拼写纠正,就像分词一样。首先,您必须实例化一个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
。此外,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] K. Gimpel 等人,“Twitter 的词性标注:注释、特征和实验”,载于计算语言学协会第 49 届年会论文集:人类语言技术:短论文卷2,2011 年,第 42-47 页。
[2] C. Potts,“情绪研讨会教程:标记化”,情绪研讨会教程,2011 年。[在线]。可用:http://sentiment.christopherpotts.net/tokenizing.html。