我想在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()}
答案 0 :(得分:0)
让我们退一步问为什么我们传统上用n-gram表示文本。 N-gram试图捕获有趣的搭配,即组合在一起的单词,例如作为二重奏的“白宫”可能比仅知道句子中包含“白色”和“众议院”这些词语更有趣。
使用n-gram的缺点是稀疏性增加 - 许多搭配频率较低。我们可能会在预测时遇到前所未有的搭配。
对于深度学习,我们可以使用诸如LSTM之类的RNN,通过单词序列捕获搭配和用语言编码的有趣信息。
处理深度学习的文本输入的一种典型方法是文本的Word2Vec编码,例如,在其上面的LSTM(或者更加花哨的BiLSTM)。