RUTA新手在这里。我正在使用RUTA处理文档,并且在开始注释之前需要进行大量的规范化。我试图找到使用RUTA中原始文档上的正则表达式和组来查找和替换字符序列的最佳方法。从本质上讲,我试图了解如何在RUTA中执行类似于String.replaceAll的操作。
例如,在Java中,
inputString = inputString.replaceAll( "(?i)7\\s*\\(SEVEN\\)", "7");
但我无法找到一种在RUTA中实现这一目标的简单方法。
由于
答案 0 :(得分:2)
一般情况下这并不简单,因为您无法更改CAS中的文档文本。
UIMA Ruta中有一些功能可以修改文档,但结果需要存储在另一个CAS视图或其他文件中。一些一般性意见:
以下是您问题中示例的脚本:
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有一些小错误导致空格加倍。
对替换进行建模的更通用的方法可能是:
DECLARE Annotation ToReplace(STRING r);
"(?i)(7)\\s*\\(SEVEN\\)" -> ToReplace ("r" = 1);
ToReplace{-> REPLACE(ToReplace.r)};
ToReplace注释现在具有一个额外的字符串功能,用于存储应替换注释的覆盖文本的值。 regexp表达式有一个额外的捕获组,用于指定注释中的字符串(使用捕获组的编号分配值)。使用REPLACE的规则现在更通用,因为不需要在操作中给出实际值,但应用了要素的值。因此,最后一条规则可用于其他规则指定的任何替换。
对于已更改的文本进行操作的连续替换需要在沙发映射的管道中指定,因为后来的规则需要在不同的视图上操作。在UIMA Ruta Workbench中,可以在单独的脚本文件中定义查找/替换,然后为每个脚本文件使用一个启动配置。启动配置能够指定输入和输出文件夹。结合ViewWriter,用户可以构建一个脚本文件链,该文件在以前的脚本文件的输出文件夹中运行。
连续替换也可以在一个脚本文件中完成,但有一些限制。 REPLACE操作实际上将新文本存储在每个RutaBasic注释的替换功能中。第一个RutaBasic获取完整的新字符串,另一个RutaBasic设置为空字符串。当修改器创建新文本时,Ruta基本注释的覆盖文本将替换为特征的值,因此第一个标记将替换为完整的替换字符串,另一个标记将被删除。知道此过程,规则可以依赖于先前的替换而操作并且改变相应的特征值。总的来说,连续替换是可能的,但不是直截了当的。