-
Notifications
You must be signed in to change notification settings - Fork 90
依存句法分析
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);
[北京, 是, 中国, 首都]