我分析了接受的版本,因为我需要 python 中的一些东西,所以我创建了一个简单的函数,它产生了相同的结果。为了解析句子,我改编了the referenced link 的版本。
import re
import string
from stanfordcorenlp import StanfordCoreNLP
from nltk import Tree
from functools import reduce
regex = re.compile('[%s]' % re.escape(string.punctuation))
def parse_sentence(sentence):
nlp = StanfordCoreNLP(r'./stanford-corenlp-full-2018-02-27')
sentence = regex.sub('', sentence)
result = nlp.parse(sentence)
result = result.replace('\n', '')
result = re.sub(' +',' ', result)
nlp.close() # Do not forget to close! The backend server will consume a lot memery.
return result.encode("utf-8")
def binarize(parsed_sentence):
sentence = sentence.replace("\n", "")
for pattern in ["ROOT", "SINV", "NP", "S", "PP", "ADJP", "SBAR",
"DT", "JJ", "NNS", "VP", "VBP", "RB"]:
sentence = sentence.replace("({}".format(pattern), "(")
sentence = re.sub(' +',' ', sentence)
return sentence
我的版本或接受的版本都没有提供与 SNLI 或 MultiNLI 语料库中相同的结果,因为它们将树的两个单叶聚集在一起。 MultiNLI 语料库中的一个示例显示
"( ( The ( new rights ) ) ( are ( nice enough ) ) )",
展位在这里回答的地方返回
'( ( ( ( The) ( new) ( rights)) ( ( are) ( ( nice) ( enough)))))'.
我不是 NLP 方面的专家,所以我希望这不会产生任何影响。至少它不适用于我的应用程序。