您如何在 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)。
我想在 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)。