如何:CNTK C#LSTM自由文本分类器(NLP)使用Word2Vec嵌入词

时间:2017-12-04 17:46:58

标签: c# nlp lstm cntk

我是CNTK的新手。我的环境是C#(不幸的是,我不是python或BrainScript程序员)。

我正在尝试使用CNTK在自由文本(NLP)上设计/训练/测试LSTM以选择合适的标题(来自给定的标题集,我的数据中约有8,000个标题)。

我使用了一个单独的程序将每个单词映射为100个元素的实数向量(100是一个可配置的值;我的非CNTK程序GloVe可以生成我选择的任何宽度)。 / p>

我的原始输入类似于:

|label 17 |features the brown fox jumped over the ...
|label 19 |features there comes a time when all ...
...

其中' 17'是第17个标题的简写,实际上是一个热门的代表:[0,0,...,1,0,0,...]其中' 1'在第17位。

每个输入行都是一系列单词(用空格分隔) - 典型长度是几百个单词,但有些数据(行)中有数千个单词。

我的问题是,我不知道如何将原始文件格式的运行时转换插入到CNTK可以使用的内容中。

我不能假设内存数据,因为在生产中我们将对数百万行的数据进行培训。

在每个小批次中:

' 17' (在上面的示例中)需要转换为[0,...,1,0,...]。

每个单词都需要翻译(通过查找到C#字典)到一个数组(100个)实数中。

我意识到这是CNTK的LSTM中的嵌入层,但我找不到任何教程/示例(特别是在C#中)如何使用非热点嵌入添加转换层。

尽管如此,我在C#中执行此操作的模板是CNTK示例中的 LSTMSequenceClassifier.cs

链接到CNTK示例: https://github.com/Microsoft/CNTK/blob/master/Examples/TrainingCSharp/Common/LSTMSequenceClassifier.cs

非常感谢任何帮助。在过去的一周里,我已经绞尽脑汁了!

1 个答案:

答案 0 :(得分:0)

由于我也是新手,但我觉得我宁愿使用最原始的数据格式,而不是寻求更高级的CNTK功能..

我的方法是

0   |feature  43:1   |label 0 0 1 0  
0   |feature  23:1   
0   |feature  15:1   
0   |feature  34:1   
1   |feature  37:1   |label 0 0 0 1  
1   |feature  67:1   
1   |feature  69:1   
1   |feature  12:1   

其中最大分类是4种不同的分类

43rd word in your matrix is "the"
23rd is "fox"

等等等等

参考https://cntk.ai/pythondocs/sequence.html

我知道阅读python可能会让你第一次感到困惑,但你会得到它的支持

https://github.com/Microsoft/CNTK/tree/master/Tests/EndToEndTests/Text/SequenceClassification/Data

拥有他们拥有的示例教程中使用的数据文件