当前位置: 首页 > 知识库问答 >
问题:

使用Apache OpenNLP查找以空格分隔的名称

黄骏喆
2023-03-14

我正在使用Apache Open NLP的NER。我已经成功训练了我的自定义数据。在使用名称查找器时,我正在根据空白拆分给定的字符串并传递字符串数组,如下所示。

NameFinderME nameFinder = new NameFinderME(model);   
String []sentence = input.split(" "); //eg:- input = Give me list of test case in project X
Span nameSpans[] = nameFinder.find(sentence);

在这里,当我使用split时,test和case作为单独的值给出,namefinder永远不会检测到它们。我将如何克服上述问题。是否有一种方法可以传递完整的字符串(而不将其拆分为数组),这样,测试用例本身就可以被视为一个整体?

共有1个答案

瞿文柏
2023-03-14

你可以用正则表达式来实现。尝试用以下内容替换第二行:

String[]句子=输入。分裂(\\s(?)?

也许有更好的方法来编写表达式,但这对我有用,输出是:

Give
me
list
of
test case
in
project
X

编辑:如果你对细节感兴趣,请在这里查看我分割的地方:https://regex101.com/r/6HLBnL/1

编辑2:如果你有很多单词没有分开,我写了一个方法来为你生成正则表达式。这就是本例中正则表达式的样子(如果不想将“测试用例”和“项目中”分开):

<代码>\s(?

下面是一个简单的程序来演示它。在本例中,只需将不需要分隔的单词放入数组unseparated

class NoSeparation {

private static String[][] unseparated = {{"test", "case"}, {"in", "project"}};

private static String getRegex() {
    String regex = "\\s(?<!";

    for (int i = 0; i < unseparated.length; i++)
        regex += "(\\s" + separated[i][0] + "\\s(?=" + separated[i][1] + "\\s))|";

    // Remove the last |
    regex = regex.substring(0, regex.length() - 1);

    return (regex + ")");
}

public static void main(String[] args) {
    String input = "Give me list of test case in project X";
    String []sentence = input.split(getRegex());

    for (String i: sentence)
        System.out.println(i);
}
}

编辑3:下面是一个非常肮脏的方法来处理超过2个单词的字符串。这是可行的,但我相信你可以用一种更有效的方式。它在短时间内工作正常,但在较长时间内可能会很慢。

您必须将不应该拆分的单词放在2d数组中,如未分隔。如果您出于某种原因不想使用%%,您还应该选择分隔符(例如,如果您的输入可能包含它)。

class NoSeparation {

private static final String SEPARATOR = "%%";
private static String[][] unseparated = {{"of", "test", "case"}, {"in", "project"}};

private static String[] splitString(String in) {
    String[] splitted;

    for (int i = 0; i < unseparated.length; i++) {
        String toReplace = "";
        String replaceWith = "";
        for (int j = 0; j < unseparated[i].length; j++) {
            toReplace += unseparated[i][j] + ((j < unseparated[i].length - 1)? " " : "");
            replaceWith += unseparated[i][j] + ((j < unseparated[i].length - 1)? SEPARATOR : "");
        }

        in = in.replaceAll(toReplace, replaceWith);
    }

    splitted = in.split(" ");

    for (int i = 0; i < splitted.length; i++)
        splitted[i] = splitted[i].replaceAll(SEPARATOR, " ");

    return splitted;
}

public static void main(String[] args) {
    String input = "Give me list of test case in project X";
    // Uncomment this if there is a chance to have multiple spaces/tabs
    // input = input.replaceAll("[\\s\\t]+", " ");

    for (String str: splitString(input))
        System.out.println(str);
}
}

 类似资料:
  • 问题内容: 这是我面临的常见任务:将一个空格分隔的列表分为一个 head 元素和一个包含 tail 元素的数组。例如,给定以下字符串: 我们想要: ..在两个不同的变量中。第一个变量应为字符串,第二个变量为数组。我正在寻找一种做到这一点的 优雅 方法(最好是在Java中)。 问题答案: 对于某些高雅的价值观: 我想不出一种用更少的代码来做到这一点的方法…

  • 问题内容: 假设(在Postgres 9.1中)有一个像这样的表: 其中有一些差距(我的意思是:并非min(date)和max(date)之间的每个可能的日期都有它的行)。 我的问题是如何汇总此数据,以便每个一致的组(不存在任何差距)被分别对待,如下所示: 有什么想法怎么做?我相信使用窗口功能是可能的,但是尝试了一段时间后,我有点卡住了。 例如,如果数据是这样的: 输出(作为汇总)将是: 问题答案

  • 刚开始编程,你们能告诉我在Java做多行输入的最好方法吗?像这样的小东西。 程序首先询问用户案例的数量。然后要求用户输入由空格分隔的2个整数。 第1列仅表示列数。id还希望能够得到第2列整数的和(25000+1000=?)

  • 问题内容: 我的表格中有一个字段,其中包含逗号分隔的字符串,例如。每个数字代表可用的颜色。 运行查询以获取所有红色衬衫(颜色= 1)时,我还会获取颜色为灰色(= 12)和橙色(= 15)的衬衫。 我应该如何重写查询,以便仅选择颜色1而不是选择所有包含数字1的颜色? 问题答案: 经典方法是在左右添加逗号: 但是find_in_set也可以:

  • 问题内容: 我有一个文件,其中包含任意数量的非对齐列,并用空格分隔。 我想对齐文件的列。 我看过该命令,它似乎不合适。 我可以编写一个AWK脚本,但似乎应该存在一个更明显的命令。 问题答案: 您可能希望该命令(通常用于生成基本表格输出): 从手册页: 确定输入包含的列数并创建一个表。默认情况下,列用空格定界,或使用–output-separator选项提供的字符定界。表输出对于漂亮打印很有用。 还

  • 当我尝试使用包“硒”执行python的自动脚本时,我遇到了一个问题 问题:如果类名由“空格”分隔,那么它会引发错误。以下是说明 错误:Web 驱动程序异常:消息:未知错误:不允许复合类名\n(会话信息:chrome=37.0.2062.120)\n(驱动程序信息:浏览器驱动程序=2.9.248315,平台=Windows NT 6.1 SP1 x86_64)' 对于那些没有被“空间”分隔的类,执行