gpt4 book ai didi

java - 如何使用斯坦福 NLP Tregex 获取包含多个单词的名词短语?

转载 作者:行者123 更新时间:2023-12-01 11:20:11 27 4
gpt4 key购买 nike

我试图弄清楚是否可以使用多个单词的条件有效地提取 NP。这是我当前的代码:

public static List<Tree> getNounPhrasesWithMultipleKeywords(Annotation doc,
List<String> tags) {
StringBuilder sb = new StringBuilder();
boolean firstWord = true;

for (int i = 0; i < tags.size(); i++) {
String word = tags.get(i);
String[] splitted = word.split(" ");
for (String splitWord : splitted) {
if (!firstWord) {
sb.append(" &");
}
sb.append(" << " + splitWord);
firstWord = false;
}

}
// sb.append(")");

TregexPattern pattern = TregexPattern.compile("NP < (__"
+ sb.toString() + ")");

return getTreeWithPattern(doc, pattern);
}

现在,假设输入短语有这棵树:

(ROOT (S (NP (ADJP (RB Poorly) (VBN controlled)) (NN asthma)) (VP (VBZ is) (NP (DT a) (JJ vicious) (NN disease))) (. .)))

我只想获取那些 NP,其中包含函数参数中指定的标签,例如对于输入 [“受控”,“哮喘”],它应该返回

(NP (ADJP (RB Poorly) (VBN controlled)) (NN asthma))

但是当输入是[“注入(inject)”、“受控”、“哮喘”]时,它应该不返回任何内容。

如您所见,如果输入字符串之一是“多个单词”,则程序会将其拆分为单词。我认为应该有更好的解决方案,但我不知道它应该如何工作。

最佳答案

我认为你只需要稍微调整一下你的模式。您并没有真正给出您想要的完整规范,但据我所知["controlled", "asthma"]应该会产生类似 (NP << (controlled .. asthma )) 的模式,这意味着“名词短语包含‘控制’后跟‘哮喘’”。我不确定你到底希望“短语”如何发挥作用;你想要["controlled asthma"]表示“‘控制’后紧接着‘哮喘’”,即 (NP << (controlled . asthma))

这是创建这些模式的函数的新版本:

  public static List<Tree> getNounPhrasesWithMultipleKeywords(Annotation doc,
List<String> tags) {
List<String> phrases = new ArrayList<String>();

for (int i = 0; i < tags.size(); i++) {
String word = tags.get(i);
String[] splitted = word.split(" ");
phrases.add(join(" . ", Arrays.asList(splitted)));
}
String pattern_str = join(" .. ", phrases);
TregexPattern pattern = TregexPattern.compile(
"NP << (" + pattern_str + ")");
return getTreeWithPattern(doc, pattern);
}

// In Java 8 use String.join.
public static String join(String sep, Collection<String> strs) {
System.out.println(strs);
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String s : strs) {
if (!first) {
sb.append(sep);
}
sb.append(s);
first = false;
}
return sb.toString();
}

此函数提供您在示例中指定的输出。

关于java - 如何使用斯坦福 NLP Tregex 获取包含多个单词的名词短语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31337604/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com