Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 斯坦福大学CoreNLP发现句子的同质部分_Java_Nlp_Stanford Nlp_Simplification - Fatal编程技术网

Java 斯坦福大学CoreNLP发现句子的同质部分

Java 斯坦福大学CoreNLP发现句子的同质部分,java,nlp,stanford-nlp,simplification,Java,Nlp,Stanford Nlp,Simplification,我正在尝试建立基于斯坦福CoreNLP的句子简化算法。我想做的简化之一是将句子中同质部分的句子转换成几个句子。 例如 我爱我的妈妈、爸爸和妹妹。->我爱我的妈妈。我爱我的爸爸。我爱我的妹妹 首先,我为输入的句子字符串构建语义图 final Sentence parsed = new Sentence(sentence); final SemanticGraph dependencies = parsed.dependencyGraph(); 这个句子的依赖关系图是 ->

我正在尝试建立基于斯坦福CoreNLP的句子简化算法。我想做的简化之一是将句子中同质部分的句子转换成几个句子。 例如

我爱我的妈妈、爸爸和妹妹。->我爱我的妈妈。我爱我的爸爸。我爱我的妹妹

首先,我为输入的句子字符串构建语义图

    final Sentence parsed = new Sentence(sentence);
    final SemanticGraph dependencies = parsed.dependencyGraph();
这个句子的依赖关系图是

-> love/VBP (root)
  -> I/PRP (nsubj)
  -> mom/NN (dobj)
    -> my/PRP$ (nmod:poss)
    -> ,/, (punct)
    -> dad/NN (conj:and)
    -> and/CC (cc)
    -> sister/NN (conj:and)
  -> dad/NN (dobj)
  -> sister/NN (dobj)
然后我在图中找到了
dobj
边和
nsubj

for (SemanticGraphEdge edge : dependencies.edgeListSorted()) {
        if (edge.getRelation().getShortName().startsWith("dobj")) {
            modifiers.add(edge);
        } else if (edge.getRelation().getShortName().startsWith("nsubj")) {
            subj = edge;
        }
    }
现在我在
modifiers
nsubj
I
word中有3条边。现在我的问题是如何将语义图分割成3个独立的图。 当然,天真的解决方案只是从
dobj
edges基于subc和governor/dependent构建句子,但我知道这是一个坏主意,不适用于更复杂的示例

for (final SemanticGraphEdge edge : modifiers) {
                SemanticGraph semanticGraph = dependencies.makeSoftCopy();
                final IndexedWord governor = edge.getGovernor();
                final IndexedWord dependent = edge.getDependent();

                final String governorTag = governor.backingLabel().tag().toLowerCase();
                if (governorTag.startsWith("vb")) {
                    StringBuilder b = new StringBuilder(subj.getDependent().word());
                    b.append(" ")
                            .append(governor.word())
                            .append(" ")
                            .append(dependent.word())
                            .append(". ");
                    System.out.println(b);

                }
            }
谁能给我一些建议吗?也许我错过了coreNLP文档中有用的东西?
谢谢。

谢谢@JosepValls的好主意。 下面是我如何用3个或更多同质词简化句子的一些代码示例

首先,我为案例定义了几个regexp

jj(optional) nn, jj(optional) nn, jj(optional) nn and jj(optional) nn
jj(optional) nn, jj(optional) nn, jj(optional) nn , jj(optional) nn ...
jj , jj , jj
jj , jj and jj
vb nn(optional) , vb nn(optional) , vb nn(optional)
 and  so on
正则表达式是

Pattern nounAdjPattern = Pattern.compile("(((jj)\\s(nn)|(jj)|(nn))\\s((cc)|,)\\s){2,}((jj)\\s(nn)|(jj)|(nn))");
Pattern verbPatter = Pattern.compile("((vb\\snn|vb)\\s((cc)|,)\\s){2,}((vb\\snn)|vb)");
这些模式将用于定义输入句子是否有同质词列表,并找到边界。然后,我根据原始句子中的单词创建姿势列表

final Sentence parsed = new Sentence(sentence);
final List<String> words = parsed.words();
List<String> pos = parsed.posTags().stream()
        .map(tag -> tag.length() < 2 ? tag.toLowerCase() : tag.substring(0, 2).toLowerCase())
        .collect(Collectors.toList());
如果句子和任何正则表达式都不匹配,让我们返回相同的字符串,换句话说,让我们简化它

if (!matcher.find()) {
    return new SimplificationResult(Collections.singleton(sentence));
}
return new SimplificationResult(simplify(posString, matcher, words));
在simplify method中,我在寻找同质部分的边界,并从单词列表3中提取部分-开始和结束,它们不会改变,同质部分将衍生为部分。在将同质部分分成几段之后,我构建了几个简化的句子,比如开始+结束+结束

 private Set<String> simplify(String posString, Matcher matcher, List<String> words) {
        String startPOS = posString.substring(0, matcher.start());
        String endPPOS = posString.substring(matcher.end());
        int wordsBeforeCnt = StringUtils.isEmpty(startPOS) ? 0 : startPOS.trim().split("\\s+").length;
        int wordsAfterCnt = StringUtils.isEmpty(endPPOS) ? 0 : endPPOS.trim().split("\\s+").length;
        String wordsBefore = words.subList(0, wordsBeforeCnt)
                .stream()
                .collect(Collectors.joining(" "));
        String wordsAfter = words.subList(words.size() - wordsAfterCnt, words.size())
                .stream()
                .collect(Collectors.joining(" "));
        List<String> homogeneousPart = words.subList(wordsBeforeCnt, words.size() - wordsAfterCnt);
        Set<String> splitWords = new HashSet<>(Arrays.asList(",", "and"));
        Set<String> simplifiedSentences = new HashSet<>();
        StringBuilder sb = new StringBuilder(wordsBefore);
        for (int i = 0; i < homogeneousPart.size(); i++) {
            String part = homogeneousPart.get(i);
            if (!splitWords.contains(part)) {
                sb.append(" ").append(part);
                if (i == homogeneousPart.size() - 1) {
                    sb.append(" ").append(wordsAfter).append(" ");
                    simplifiedSentences.add(sb.toString());
                }
            } else {
                sb.append(" ").append(wordsAfter).append(" ");
                simplifiedSentences.add(sb.toString());
                sb = new StringBuilder(wordsBefore);
            }
        }
        return simplifiedSentences;
如果我们使用上面的2个正则表达式,将简化为9个句子

I adore my clever dad . 
I love my clever dad . 
I love my sister . 
I kiss my sister . 
I kiss my clever dad . 
I adore my sister . 
I love my beautiful mom . 
I adore my beautiful mom . 
I kiss my beautiful mom . 
这些代码仅适用于3个或更多同质字,因为2个字有很多例外。例如

Cat eats mouse, dog eats meat.

这个句子不能这样简化。

在这里扮演魔鬼代言人:你们将如何简化“我妈妈和我爸爸爱我和我妹妹”?相反,您是否考虑过尝试提取您关心的语义关系(本身非常困难),然后使用简单的模板,您可以使用提取的信息进行实例化?@JosepValls当然,您的示例所需的输出将是4句话,“我妈妈爱我”、“我妈妈爱我妹妹”等等。当然,我知道这几乎是不可能的。通过模板,你的意思是我需要的是构建词性模式,并寻找类似“NN,NN,NN”的东西?
I adore my clever dad . 
I love my clever dad . 
I love my sister . 
I kiss my sister . 
I kiss my clever dad . 
I adore my sister . 
I love my beautiful mom . 
I adore my beautiful mom . 
I kiss my beautiful mom . 
Cat eats mouse, dog eats meat.