你如何在MxNet中计算n-gram?

时间:2017-10-02 22:28:04

标签: n-gram mxnet

我想在MxNet中对一组字符串进行N-gram。最好是,我会做类似TFIDF Vectorizing的事情,但即使是一个简单的N-gram,其数量和功能也会很好。这有内置功能吗?什么是最好的方法?

目前,我正在用Python计算它,

def tfidf(str_list, ngram_width=3):
    tf = {}
    for s in str_list:
        for start, end in zip(range(len(s) - ngram_width),
                              range(ngram_width, len(s))):
            if s[start:end] not in tf:
                tf[s[start:end]] = 0
            tf[s[start:end]] += 1

    idf = {}
    for t in tf.keys():
        cnt = 0
        for s in str_list:
            if t in s:
                cnt += 1
            idf[t] = len(str_list)/(cnt + 1.0)

    return {t:tf[t]*idf[t] for t in tf.keys()}

1 个答案:

答案 0 :(得分:0)

让我们退一步问为什么我们传统上用n-gram表示文本。 N-gram试图捕获有趣的搭配,即组合在一起的单词,例如作为二重奏的“白宫”可能比仅知道句子中包含“白色”和“众议院”这些词语更有趣。

使用n-gram的缺点是稀疏性增加 - 许多搭配频率较低。我们可能会在预测时遇到前所未有的搭配。

对于深度学习,我们可以使用诸如LSTM之类的RNN,通过单词序列捕获搭配和用语言编码的有趣信息。

处理深度学习的文本输入的一种典型方法是文本的Word2Vec编码,例如,在其上面的LSTM(或者更加花哨的BiLSTM)。