Skip to content

依存句法分析

Xusheng edited this page Mar 3, 2020 · 2 revisions

关于依存标签的详细说明,可以参见《依存标签》

依存句法分析

CoNLLSentence DependencyParse(String sentence)

依存句法分析封装了基于神经网络的高性能依存句法分析器,分析结果为 CoNLL 格式,可以按 CoNLLWord 类型进行迭代。CoNLLWord.LEMMA 为从属词,CoNLLWord.HEAD.LEMMA 为支配词,CoNLLWord.DEPREL 为依存标签。

参数

  • sentence: 待分析的句子
  • return: 分析结果,CONLL格式

示例

String sentence = "北京是中国的首都";
CoNLLSentence deps = AHANLP.DependencyParse(sentence);
for (CoNLLWord dep : deps)
    System.out.printf("%s --(%s)--> %s\n", dep.LEMMA, dep.DEPREL, dep.HEAD.LEMMA);
北京 --(主谓关系)--> 是
是 --(核心关系)--> ##核心##
中国 --(定中关系)--> 首都
的 --(右附加关系)--> 中国
首都 --(动宾关系)--> 是

依存标签默认使用中文,如果要使用英文标签,只需再带上第二个参数,并且设为 true 就可以了

CoNLLSentence DependencyParse(String sentence, boolean englishTag)

参数

  • sentence: 待分析的句子
  • englishTag: 是否使用英文标签
  • return: 分析结果,CONLL格式

示例

String sentence = "北京是中国的首都";
CoNLLSentence deps = AHANLP.DependencyParse(sentence, true);
for (CoNLLWord dep : deps)
    System.out.printf("%s --(%s)--> %s\n", dep.LEMMA, dep.DEPREL, dep.HEAD.LEMMA);
北京 --(SBV)--> 是
是 --(HED)--> ##核心##
中国 --(ATT)--> 首都
的 --(RAD)--> 中国
首都 --(VOB)--> 是

关于依存标签的详细说明,可以参见《依存标签》

依存句法分析过程需要进行分词,因此也支持直接传入分词结果(List)

CoNLLSentence DependencyParse(List<Term> segResult, boolean englishTag)

参数

  • segResult: 分词结果
  • englishTag: 是否使用英文标签
  • return: 分析结果,CONLL格式

示例

String sentence = "北京是中国的首都";
List<Term> result = Segment.NLPSegment(sentence);
CoNLLSentence deps = AHANLP.DependencyParse(result, true);
for (CoNLLWord dep : deps)
    System.out.printf("%s --(%s)--> %s\n", dep.LEMMA, dep.DEPREL, dep.HEAD.LEMMA);
北京 --(SBV)--> 是
是 --(HED)--> ##核心##
中国 --(ATT)--> 首都
的 --(RAD)--> 中国
首都 --(VOB)--> 是

获取词语的依存路径也是NLP中的常见操作,例如很多任务会需要获得词语之间的依存路径

获得词语依存路径

List<List<Term>> getWordPathsInDST(String sentence)

获得所有词语的依存路径,每一个词语都返回到Root节点的完整路径

参数

  • sentence: 待分析句子
  • return: 依存路径列表,每一条路径对应一个词语

示例

String sentence = "北京是中国的首都";
List<List<Term>> wordPaths = AHANLP.getWordPathsInDST(sentence);
for (List<Term> wordPath : wordPaths) {
    System.out.println(wordPath.get(0).word + " : " + AHANLP.getWordList(wordPath));
}
北京 : [北京, 是]
是 : [是]
中国 : [中国, 首都, 是]
的 : [的, 中国, 首都, 是]
首都 : [首都, 是]

同样地,也可以直接传入分词结果,获得词语的依存路径列表

List<List<Term>> getWordPathsInDST(List<Term> segResult)

参数

  • segResult: 分词结果
  • return: 依存路径列表,每一条路径对应一个词语

示例

String sentence = "北京是中国的首都";
List<Term> segResult = AHANLP.NLPSegment(sentence);
List<List<Term>> wordPaths = AHANLP.getWordPathsInDST(segResult);
for (List<Term> wordPath : wordPaths) {
    System.out.println(wordPath.get(0).word + " : " + AHANLP.getWordList(wordPath));
}
北京 : [北京, 是]
是 : [是]
中国 : [中国, 首都, 是]
的 : [的, 中国, 首都, 是]
首都 : [首都, 是]

获取词语的深度

Map<String, Integer> getWordsDepthInDST(String sentence)

获取所有词语在依存树中的深度

参数

  • sentence: 待分析句子
  • return: 词语在句法树中的深度

示例

String sentence = "北京是中国的首都";
Map<String, Integer> wordsDepth = AHANLP.getWordsDepthInDST(sentence);
for (Map.Entry<String, Integer> entry : wordsDepth.entrySet()) {
    System.out.println(entry.getKey() + " --- " + entry.getValue());
}
的 --- 3
首都 --- 1
中国 --- 2
北京 --- 1
是 --- 0

同样地,也可以直接传入分词结果,获得所有词语在句法树中的深度

Map<String, Integer> getWordsDepthInDST(List<Term> segResult)

参数

  • segResult: 分词结果
  • return: 词语在句法树中的深度

示例

String sentence = "北京是中国的首都";
List<Term> segResult = AHANLP.NLPSegment(sentence);
Map<String, Integer> wordsDepth = AHANLP.getWordsDepthInDST(segResult);
for (Map.Entry<String, Integer> entry : wordsDepth.entrySet()) {
    System.out.println(entry.getKey() + " --- " + entry.getValue());
}
的 --- 3
首都 --- 1
中国 --- 2
北京 --- 1
是 --- 0

获取上层词语

List<String> getTopWords(String sentence, int maxDepth)

获取指定深度内的词语,词语距离Root节点的深度在一定程度上可以反映词语的重要程度,因此获取上层词语可以看作是获取句子中相对重要的信息。

参数

  • sentence: 待分析句子
  • maxDepth: 句法树最大深度
  • return: 上层词语列表

示例

String sentence = "北京是中国的首都";
List<String> words = AHANLP.getTopWordsInDST(sentence, 2);
System.out.println(words);
[北京, 是, 中国, 首都]

同样地,也可以直接传入分词结果

List<String> getTopWordsInDST(List<Term> segResult, int maxDepth)

参数

  • segResult: 分词结果
  • maxDepth: 句法树最大深度
  • return: 上层词语列表

示例

String sentence = "北京是中国的首都";
List<Term> segResult = AHANLP.NLPSegment(sentence);
List<String> words = AHANLP.getTopWordsInDST(segResult, 2);
System.out.println(words);
[北京, 是, 中国, 首都]