'Extract keywords from sentence using TF-IDF algorithm.
Parameter:
- topK: return how many top keywords. `None` for all possible words.
- withWeight: if True, return a list of (word, weight);
if False, return a list of words.
- allowPOS: the allowed POS list eg. [\'ns\', \'n\', \'vn\', \'v\',\'nr\'].
if the POS of w is not in this list,it will be filtered.
- withFlag: only work with allowPOS is not empty.
if True, return a list of pair(word, weight) like posseg.cut
if False, return a list of words'

def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):

    if allowPOS:
        allowPOS = frozenset(allowPOS)
        words = self.postokenizer.cut(sentence)
    else:
        words = self.tokenizer.cut(sentence)
    freq = {}
    for w in words:
        if allowPOS:
            if (w.flag not in allowPOS):
                continue
            elif (not withFlag):
                w = w.word
        wc = (w.word if (allowPOS and withFlag) else w)
        if ((len(wc.strip()) < 2) or (wc.lower() in self.stop_words)):
            continue
        freq[w] = (freq.get(w, 0.0) + 1.0)
    total = sum(freq.values())
    for k in freq:
        kw = (k.word if (allowPOS and withFlag) else k)
        freq[k] *= (self.idf_freq.get(kw, self.median_idf) / total)
    if withWeight:
        tags = sorted(freq.items(), key=itemgetter(1), reverse=True)
    else:
        tags = sorted(freq, key=freq.__getitem__, reverse=True)
    if topK:
        return tags[:topK]
    else:
        return tags
