2021SC@SDUSC
在上一博客中,参数text_obj代表了我们想要提取候选词的输入文档,这些定义在input_representation.py文件中的class InputTextObj中,接下来我们就详细分析文件input_representation.py。
参数说明:
pos_tagged:列表的列表,这里是sentence的列表,这里的每一个sentence都是一个元组列表(word,TAG),其中word代表单词,TAG代表词性。
stem:如果我们项在文本中使用stemming。
类InputTextObj
一、def _ init _(self, pos_tagged, lang, stem=False, min_word_len=3初始化函数:
初始化:
self.min_word_len = min_word_len
self.considered_tags = {'NN', 'NNS', 'NNP', 'NNPS', 'JJ'}
self.pos_tagged = []
self.filtered_pos_tagged = []
self.isStemmed = stem
self.lang = lang
根据stem初始化pos_tagged:
if stem:
stemmer = PorterStemmer()
self.pos_tagged = [[(stemmer.stem(t[0]), t[1]) for t in sent] for sent in pos_tagged]
else:
self.pos_tagged = [[(t[0].lower(), t[1]) for t in sent] for sent in pos_tagged]
将符合条件的pos_tagged临时存放在temp数组中,再赋值给pos_tagged:
temp = []
for sent in self.pos_tagged:
s = []
for elem in sent:
if len(elem[0]) < min_word_len:
s.append((elem[0], 'LESS'))
else:
s.append(elem)
temp.append(s)
self.pos_tagged = temp
转换一些具体的词性标签,比如NC、NE转换为NN,或者ADJA转换为JJ,具体使用了convert函数:
if lang in ['fr', 'de']:
self.pos_tagged = [[(tagged_token[0], convert(tagged_token[1])) for tagged_token in sentence] for sentence
in
self.pos_tagged]
self.filtered_pos_tagged = [[(t[0].lower(), t[1]) for t in sent if self.is_candidate(t)] for sent in
self.pos_tagged]
二、def is_candidate(self, tagged_token)函数:
输入:元组(word,TAG)。
输出:一个有效的候选词。
def is_candidate(self, tagged_token):
return tagged_token[1] in self.considered_tags
三、def extract_candidates(self)函数:
返回所有的候选词:
def extract_candidates(self):
return {tagged_token[0].lower()
for sentence in self.pos_tagged
for tagged_token in sentence
if self.is_candidate(tagged_token) and len(tagged_token[0]) >= self.min_word_len
}
四、def convert(fr_or_de_tag)函数:
如果tag为’NN’、‘NNE’、‘NE’、‘N’、‘NPP’、‘NC’、‘NOUN’的其中一种,则转换为’NN’;
如果tag为’ADJA’、‘ADJ’的其中一种,则转换为’JJ’;
否则将原参数返回。
def convert(fr_or_de_tag):
if fr_or_de_tag in {'NN', 'NNE', 'NE', 'N', 'NPP', 'NC', 'NOUN'}:
return 'NN'
elif fr_or_de_tag in {'ADJA', 'ADJ'}:
return 'JJ'
else:
return fr_or_de_tag