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

How do you compute n-grams in 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()}

让我们退后一步,问问为什么 我们传统上会用 n-gram 表示文本。 N-gram 试图捕捉有趣的搭配,即组合在一起的单词,例如"White House" 作为二元语法可能比只知道句子包含 "White" 和 "House".

更有趣

使用 n-gram 的缺点是增加了稀疏性——许多搭配的频率很低。我们可能会在预测时遇到以前从未见过的搭配。

对于深度学习,我们可以使用诸如 LSTM 之类的 RNN 来捕捉搭配和语言编码的有趣信息。

因此,处理深度学习文本输入的典型方法是对文本进行 Word2Vec 编码,例如,在其之上添加 LSTM(或更花哨的 BiLSTM)。