登录 帮助
打印
主页维基常规食谱
 

Groovy食谱

1导出到CSV

这将导出每个注释集中每个注释的所有特性和值,为您打开了一个集成和分析可能性的世界。

scriptParams需要一个名为“outputFile”的键,该键具有要附加到的文件路径的值。此文件被附加到!如果您不喜欢,请更改脚本

还要注意,如果您的任何特征值包含换行符,那么这些换行符将被输出。您的导入程序需要处理此问题-如果功能值如下所示,LibreOffice Calc就可以了。

新文件(scriptParams.outputFile).withWriterAppend{out->(doc.getNamedAnnotationSets()+[默认值:(doc.getAnnotations())]).each{setName,set->集合.每个{anno->if(anno.getFeatures())anno.getFeatures().each{fName,fValue->out.writeLine(/“${doc.getName()}”,“${setName}”}其他的out.writeLine(/“${doc.getName()}”,“${setName}”}}}

2按文档功能筛选

这个在用户指南中

Factory.newCorpus(“fredsDocs”).addAll(docs.findAll{it.features.annotator==“弗雷德”} )

三。如果存在注释集,则进行筛选-例如双重注释

用于从语料库中分离所有带双注释的文档

Factory.newCorpus(“doubleDocs”).addAll(docs.findAll{(it.annotationSetNames.contains(“注释器1”)&&it.annotationSetNames.contains(“注释器2”)})

4如果存在批注,则进行筛选

用于分离带有罕见注释的文档

Factory.newCorpus(“filtered”).addAll(docs.find全部{!it.getAnnotations(“SETNAME”).get(“TYPE”).isEmpty()} )

5选择要执行的应用程序

您已经可以基于文档功能有条件地执行请购单。通过将两个管道作为PR放置在第三个条件管道中,您可以扩展它以基于文档功能执行管道。这个Groovy脚本更进一步,根据文档的其他方面(在本例中是特定注释集的存在)选择要执行的管道。

app1=apps.find{it.name.equals(“app1”)}app2=apps.find{it.name.equals(“app2”)}Factory.newCorpus(“tempCorpus”).withResource{tempCopus->docs.find全部{app=(it.annotationSetNames.contains(“annotator1”))?应用1:应用2tempCorpus.add(它)app.set语料库(temp语料库)app.execute()tempCorpus.clear()}}打印“完成”

6有多少注释?

总和=0docs.find全部{def filteredAnnots=it.getAnnotations(“已筛选”)num=filteredAnnots[“Anatomy”].size()总和+=数字println it.name+“”+数字}println“总计:”+“”+总和

7有多少文档具有特定的注释和功能?

在这种情况下,默认注释集中有多少文档包含png图像的图像标记?

计数=0每个{doc->hasFeature=假doc.getAnnotations()[“img”].each{anno->如果(anno.getFeatures()[“src”]=~/.*png/)hasFeature=true}if(hasFeature)计数++}打印计数

8统计语料库中所有集合和文档的注释数

这将打印出每个文档的名称,然后是该文档中的所有AnnotationsSet,其中包含每个Annotation类型的计数,最后是每个Annotion类型的总计。最后,在整个语料库中给出注释集和类型的总数。

corpusTotalCounts=[:].withDefault{0}corpusSetCounts=[:]每个{doc->println文档.getName()docCounts=[:].withDefault{0}//默认批注集println“默认注释集”corpusSetCounts[“Default”]=corpusSettings[“Default]?:[:].使用默认值{0}setCounts=[:].withDefault{0}doc.getAnnotations().each{anno->(setCounts[(anno.getType())])++(文档计数[(anno.getType())])++(公司总数[(anno.getType())])++(corpusSetCounts[“默认”][(anno.getType())])++}println“${setCounts}”//命名注释集doc.getAnnotationSetName().each{asName->println“${asName}注释集”corpusSetCounts[(asName)]=corpusSettings[(asName)]?:[:].使用默认值{0}setCounts=[:].withDefault{0}doc.getAnnotations(asName).each{anno->(setCounts[(anno.getType())])++(文档计数[(anno.getType())])++(公司总数[(anno.getType())])++(企业设置计数[(asName)][(anno.getType())])++}println“${setCounts}”}println“文档总数:${docCounts}”}打印“”println“语料库总数:${corpusTotalCounts}”println“语料库注释集总计:”corpusSetCounts.each公司{println“${it.key}${it.value}”}

另一种方法可能是使用以下方法,然后进行一些展平和扩散以求和?

defaultSetName=“默认”计数=[:]每个{doc->docName=文档.getName()计数[(docName)]=计数[(文档名称)]?:[:]计数[(docName)][(defaultSetName)]=计数[(文档名称)][[(default SetName)]?:[:].使用默认值{0}doc.getAnnotations().each{anno->(计数[(docName)][(defaultSetName)][(anno.getType())])++}doc.getAnnotationSetNames().each{setName->计数[(文档名称)][(集合名称)]=计数[(文件名称)][[(集合名)]?:[:].使用默认值{0}doc.getAnnotations(setName).each{anno->(计数[(docName)][(setName)]][(anno.getType())])++}}   }

9重命名批注

这一个是针对Groovy PR的,但可以使用上述思想轻松适应控制台。如果需要,还可以对其进行参数化-有关详细信息,请参阅用户指南。

输入AS.findAll{it.type==“旧名称”}.每个{outputAS.add(it.start(),it.end(),“新名称”,it.features.toFeatureMap())//克隆功能图}.每个{输入AS.删除(it)}

10使用取自要素的新名称复制注释

这将获取具有给定特征的给定类型的所有注释(在本例中,将注释提到具有类特征的键集中),并复制到以该特征的值命名的新注释(在此例中,是类特征的值)。

例如,如果您有带有class=Person或class=Organisation的Mention注释,那么您最终会得到Person和Organision注释。

每个文档{d->key=d.getAnnotations(“key”)key.get(“提及”).each{m->key.add(m.start(),m.end(),m.getFeatures().get(“类”),m.getFeature().toFeatureMap())}}

11删除几乎重复的注释

Groovy PR的这个脚本删除了具有相同类型和起始偏移量和结束偏移量的额外注释,每个位置留一个。您还可以使用GATEAPI测试功能。

List<Annotation>anList=new ArrayList<Annotation>(inputAS.get(“MultiWord”));Collections.sort(annList,new OffsetComparator());for(int i=0;i<annList.size()-1;i++){注释annI=annList.get(i);for(int j=i+1;j<annList.size();j++){注释annJ=annList.get(j);if(annJ.getStartNode().getOffset().equals(annI.getStartNode.getOffset()))&&annJ.getEndNode().getOffset().equals(annI.getEndNode().getOffset(())){inputAS.remove(annI);断裂;}}}

12计算语料库中每个文档的TF-IDF分数

这个tfidf.groovy公司plugins/Groovy/resources/scripts中的脚本为整个语料库创建一个TF-IDF频率图,并将其作为一个特征存储在语料库中。如果您有大量文档,您可能更喜欢为每个文档创建一个TF-IDF映射,并将每个映射存储为相应文档上的一个功能。如果是,请修改公司()之后方法如下:

语料库后无效(c){def tfIdfDoc=[:]//映射以存储每个文档的TF-IDF分数docMap.each{term,docsWithTerm->def idf=数学.log((双)docNum/docsWithTerm.size())文档WithTerm.each{docId->tfIdfDoc[docId]=频率[docId]tfIdfDoc[docId][term]=频率[docId][term]*idf}}//将文档TF-IDF分数存储为每个文档上的一个功能定义i=0c.每个{doc->doc.features.freqTable=tfIdfDoc[i]我++}}

13为文档中有趣的部分及其周围的位添加注释

docEnd=门。Utils.end(文档);//从文档上的现有批注设置批注类型有趣的注释=inputAS.get(“有趣”);intStart=门。Utils.start(interestingAnnots);intEnd=门。Utils.end(interestingAnnots);//为4个不同的分区添加新注释outputAS.add(0L,docEnd,“WholeDoc”,Factory.newFeatureMap());outputAS.add(0L,intStart,“BeforeInt”,Factory.newFeatureMap());outputAS.add(intStart、docEnd、“IntZone”、Factory.newFeatureMap());outputAS.add(intEnd,docEnd,“AfterInt”,Factory.newFeatureMap());