ekphrasis使用说明
介绍:
ekphrasis是一个开源语言预处理工具,项目地址为https://github.com/cbaziotis/ekphrasis。
ekphrasis是一个轻量级的文本预处理工具,处理的对象是社交网络,比如推特,或者facebook,该工具的主要作用是语言的规范化、意群分段、单词分割和拼写校正。也可以使用从两个大的语料库维基百科以及推特中进行词语统计。
ekphrasis是dataStories小组为semEval-2017 task4 推特情感分析 提交的一个文本处理管道。
如果你在你的研究项目中用到了该库,请引用这篇文章《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, Ca***}, publisher = {Association for Computational Linguistics}, pages = {747--754} }
安装方式为: pip install ekphrasis
总览:
ekphrasis提供以下功能: 1、社交实体识别:一个瞄准社交网络的实体识别器应该能够理解复杂的情感符号,表情和其他一些结构化的表述例如日期、时间等等。
2、词语分段:已将一个长的文本分割成意思连贯的单词,这适合于标签的切分
3、拼写错误纠正:对于错误拼写的单词,给出合适的候选词汇。
4、定制化的功能:泰勒词汇分词,拼写错误纠正,事物识别这些都是你需要的功能。
语段分割和拼写错误纠正机制都是基于从规定语料库中收集到的单词进行统计的,ekphras提供了基于两大语料库(维基百科和推特)的单词统计。如果你在特定领域进行工作,你可能想产生基于你自己语料库的你自己的单词数据,比如说生物领域。比如说描写特定技术或者化学成的的单词如果使用通用语料库很可能会被视为一个拼写错误的单词。
ekpharasis的实体识别器基于正则表达式。你可以通过将新实体的正则表达式加入字典的方式,轻松地使ekphasis识别新的实体。
5、预处理管道。你可以将上述步骤组合为你的机器学习分析提供各种各样的文本文件。另外,通过上述步骤你也可以实现文本规范化,文本注释(标签等功能)。
文本预处理管道
你可以通过textPreProcessor轻松地定义一个预处理管道。
#导入ekphrasis库 from ekphrasis.classes.preprocessor import TextPreProcessor from ekphrasis.classes.tokenizer import socialTokenizer from ekphrasis.dicts.emoticons import emoticons text_processor = TextPreprocessor( #将要被规范化的单词 normalizer = ['url','email', 'percent', 'money', 'phone', 'user', 'time', 'url', 'date', 'number'], #将要被注释的单词 annotate={"hashtag", "allcaps", "elongated", "repeated", "emphasis", "censored"}, ##fix HTML tokens(什么意思,忽略HTML标签吗?) fix_html = True, #为单词分段,将要使用的单词统计语料库来源是什么 segmenter = "twitter", #为拼写纠正,将要使用的单词语料库来源是什么 corrector = twitter, unpack_hashtags = True, #在标记上使用单词分段 unpack_contraction = True, #分开连接词如can't -> can not spell_correct_elong = False, #拼写纠正加长的单词 #选择一个分词器,你使用视角网络分词器或者传入一个分词器以一个单词作为输入输出是一系列单词 tokenizer = SocialTokenizer(lowercase = True).tokenize #列举出一个字典将对应的标识分解为文本,可以传入一个字典。 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 wait for the new season of twin peaks \(^o^)/ ! david lynch tv series i saw the new john doe movie and it sucks ! waisted . bad movies : can not wait for the sentiment talks ! yay !
单词数据
ekphrasis提供2大语料库的单词数据资料
1、英文的维基百科
2、3亿3千万的推特信息
这些单词数据对于词语分段和拼写纠正是有用的,同时你可以根据自己的语料库产生自己的单词数据,你可以使用ekphrasis/tools/generate_stats.py 产生对于一个文本文件或者是包含文本文件的集合字典的统计数据,例如为了产生text8(http://mattmahoney.net/dc/text8.zip)的统计数据,你可以使用以下语句:
python generate_stas.py --input text8.txt --name text8 --ngrams 2 --mincount 70 30
各参数的含义分别为:
input是输入文件活字典的路径
name是语料库的名称
ngram表示最多使用什么样的ngrams来计算统计信息
mincount代表每个ngram最少出现的次数,在上一例子中对于unigrams最少的出现次数是70,对于bigram而言最少出现的次数是30
单词分割
单词分割使用的是维特比算法基于Beatiful Data第十四章的内容实现。该功能主要实现了字符串中单词的分割功能。
举例来说:为实现单词的分割功能我们可以使用给定的语料库,然后使用单词分割功能:
from ekphrasis.classes.segmenter import Segmenter
seg = Segmenter(corpus = "mycorpus")
print(seg.segment("smallandinsignificant")
输出的结果为: small and significant
也可以尝试使用不同的语料库来对单词进行分割,产生的效果也是不同的
seg_eng = Segmenter(corpus="english") seg_tw = Segmenter(corpus="twitter")
结果不在赘述。
单词分割中,如果单词出现了驼峰形式(开头为小写,大小写交替)或者pascal形式(开头为大写的大小写交替),分词算法将按照驼峰出现的位置切分单词。
例如:
from ekphrasis.classes.segmenter import Segmenter seg = Segmenter() print(seg.segment("camelCased")) print(seg.segment("PascalCased")
输出结果为:
camel cased
passcal cased
拼写纠正
拼写纠正是基于peter norvig的拼写纠正器的。就像单词分割算法一样,我们利用单词的统计信息来寻找最可能的候选,当然你也可以使用你自己的的语料库。
举例而言:
from ekphrasis.classes.spellcorrect import SpellCorrector
sp = SpellCorrector(copus="english")
print(sp.correct("korrect"))
输出的结果应该是:correct
社交实体:
实体化的最难之处在于保持单词的完整性(作为一个实体)。在需要应付经常会出现创新词汇以及表示,例如表情符号,特殊标识等内容的社交网络中文本中这个更加难于处理。虽然网络上已经有一些工具能够实现对推特中部分情感标识和简单的感情符号的识别。但是我们提供的工具可以实现对基本上所有情感符号,表情符号和复杂标识的识别。
特别是在情感分析中,文本中的情感符号实体标识的识别在分析文本的情感中具有极其重要的作用。
例如:被审查的词汇: f**k, s**t
重点标记的词汇:a *great* time, i don't *think* I ....
表情符号例如:>:( :)) \o/
分隔符分开的单词如 over-consumption, anti-american, mind-blowing
而且kephrasis可以是识别出包含信息的表达式,根据任务的不同你可能想保持或者从某个实体中抽取信息,同时对任务无关信息进行抽取,例如:
日期: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
form 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)#原始的文本
print("wsp:",s) #空白分割的文本
print("SC:", s)#使用社交网络分割的文本
输出结果如下:
O
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',
- 点赞
- 收藏
- 关注作者
评论(0)