首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIMA RUTA -如何使用正则表达式和组查找和替换

UIMA RUTA -如何使用正则表达式和组查找和替换
EN

Stack Overflow用户
提问于 2014-03-22 13:15:44
回答 1查看 1.4K关注 0票数 3

鲁塔新手来了。我正在使用RUTA处理一个文档,在开始注释之前,我需要做大量的规范化工作。我正在试图找到最好的方法来使用RUTA中的原始文档中的正则表达式和组来查找和替换字符序列。本质上,我试图了解如何在RUTA中执行类似于String.replaceAll的操作。

例如,在Java中,

代码语言:javascript
复制
inputString = inputString.replaceAll( "(?i)7\\s*\\(SEVEN\\)", "7");

但我想不出一个简单的方法在鲁塔实现这一点。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-24 12:10:21

一般来说,这并不简单,因为您不能在CAS中更改文档文本。

UIMA中有一些修改文档的功能,但是需要将结果存储在另一个CAS视图或其他文件中。以下是一些一般性意见:

  • 简单的正则表达式可用于匹配模式,如您的问题:http://uima.apache.org/d/ruta-current/tools.ruta.book.html#ugr.tools.ruta.language.regexprule
  • 操作替换使您能够记住修改。
  • 修饰符分析引擎能够执行修改,并且能够将修改后的文档存储在附加的CAS视图和附加的HMTL文件中(HMTL,因为修饰符还可以添加有色跨度)。
  • 如果要使用“ViewWriter”,则_initialView anaylsis引擎可以将视图复制到另一个视图。
  • 如果您的文档包含注释,并且这些注释在替换后也应该是有效的,那么需要不同的功能。HTMLConverter有一些替换参数,但如果没有更多信息或进一步的测试,我不知道它是否解决了这个用例中的问题。

下面是您问题中示例的脚本:

代码语言:javascript
复制
ENGINE utils.Modifier;
ENGINE utils.ViewWriter;
TYPESYSTEM utils.SourceDocumentInformation;
DECLARE ToReplace;

// just create an annotation
"(?i)7\\s*\\(SEVEN\\)" -> ToReplace;

// replace the text covered by all annotations with the string "7"
ToReplace{-> REPLACE("7")}; 
//... the annotation should be removed again with UNMARK before different replacements are performed...  
// it is also possible to do this in a more generic way with features and variables

// ... either store the changed text in the "modified" view and in an additional html file
Document{-> CONFIGURE(Modifier, "outputLocation" = "D:/modified/"), EXEC(Modifier)};

// ... or store the changed text in the "modified" view and in an additional xmiCAS
Document{-> EXEC(Modifier), CONFIGURE(ViewWriter, "inputView" = "modified", "output" = "../modified/"), EXEC(ViewWriter)};

值得一提的是: Modfier有一些小错误,导致空白空间加倍。

对替代者进行建模的一种更通用的方法可以是:

代码语言:javascript
复制
DECLARE Annotation ToReplace(STRING r);
"(?i)(7)\\s*\\(SEVEN\\)" -> ToReplace ("r" = 1);
ToReplace{-> REPLACE(ToReplace.r)};

ToReplace注释现在有了一个额外的字符串特性,它存储应该替换注释覆盖文本的值。regexp表达式有一个额外的捕获组,用于指定注释中的字符串(使用捕获组的数量分配值)。替换规则现在更通用了,因为实际值不需要在操作中给出,但是特性的值是应用的。因此,最后一条规则可以用于其他规则指定的任何替换。

在修改后的文本上操作的连续替换通常需要在管道中指定,因为以后的规则需要对不同的视图进行操作。在中,可以在单独的脚本文件中定义查找/替换,然后对每个脚本文件使用一个启动配置。启动配置能够指定输入和输出文件夹。结合ViewWriter,用户可以构建一个脚本文件链,这些脚本文件可以在以前的脚本文件的输出文件夹中操作。

连续的替换也可以在一个脚本文件中完成,但有一些限制。替换操作实际上将新文本存储在每个RutaBasic注释的替换特性中。第一个RutaBasic获得完整的新字符串,另一个RutaBasic被设置为空字符串。当修饰符创建新文本时,Ruta基本注释的覆盖文本将被功能的值替换,因此第一个令牌被完全替换字符串替换,而另一个令牌被删除。了解此过程后,规则可以操作依赖于先前的替换,并更改各自的特征值。总的来说,连续的替换是可能的,但不是简单的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22578101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档