2016-10-11 24 views
2

我正在研究一个小型研究项目。我期待编写一个程序 a)需要大量短文本(〜100字/几千文本) b)识别文本中的关键字 c)将所有这些文本呈现给一组用户,他们发现它们很有趣 d)软件了解哪些关键字或组合可能更可取。假设这个例子的目标群体是统一的。量化神经网络分析的文本关键词

现在,有两个主要挑战。第一个我有一个答案,第二个我正在寻求帮助。

1)关键字标识。 反向频率分析似乎是这里走的路。确定与其他所有人相比,在给定文本中经常按比例出现的单词。这虽然有一些缺点,但例如很常见的关键字可能会被忽略。

2)如何准备数据集为数字。我可以将关键字映射到输入神经元,然后根据它们的相对频率调整值,但这限制了模型,并且很难添加新的关键字。如果我们想扩展几十个关键字,它也很快变得竞争激烈。

这个问题通常如何解决?

+0

关于单词的优选组合,您是否考虑过使用HMM的变体?我在这个话题上的经验表明,由于组合的性质,这是您的案例。如果你有兴趣让我知道,虽然网络搜索将产生丰富的资源,用于与HMMs解决语言相关的任务 – rpd

回答

1

这是开始一个办法:

  • 清洁您的输入文本(除去特殊标记等)
  • 使用正克为特征(可以只是1克开始)。
  • 将用户的反馈视为“优先与否”作为二进制标签。
  • 学习二元分类器(无论哪种模型都很好,朴素贝叶斯,逻辑回归)。

1)关键字识别。逆向频率分析似乎是这里的一种方式。确定与其他所有人相比,在给定文本中经常按比例出现的单词。这虽然有一些缺点,但例如很常见的关键字可能会被忽略。

您可以在您制作的第一个模型中跳过此部分。把这个句子当作一堆单词(n-grams)来简化第一个工作模型。如果你愿意,你可以稍后添加它作为特征权重。

2)如何准备数据集为数字。我可以将关键字映射到输入神经元,然后根据它们的相对频率调整值,但这限制了模型,并且很难添加新的关键字。如果我们想扩展到超过几十个关键词

您可以只使用一个字典映射正克整数ID也会很快成为竞争力的价格昂贵。每个训练例如,特征是稀疏的,因此有一个像下面的训练例子:

34, 68, 79293, 23232 -> 0 (negative label) 
340, 608, 3, 232  -> 1 (positive label) 

Imagine you have a dictionary (or vocabulary) mapping: 
3: foo 
34: movie 
68: in-stock 
232: bar 
340: barz 
... 

使用神经网络,你将需要有一个嵌入层通过聚合把稀疏特征成致密的特点(例如,平均)所有特征的嵌入向量。 使用上面同样的例子,假设我们只需要使用4维嵌入:

34 -> [0.1, 0.2, -0.3, 0] 
68 -> [0, 0.1, -0.1, 0.2] 
79293 -> [0.3, 0.0, 0.12, 0] 
23232 -> [0.4, 0.0, 0.0, 0] 
------------------------------- sum 
sum -> [0.8, 0.3, -0.28, 0.2] 
------------------------------- L1-normalize 
l1 -> [0.8, 0.3, -0.28, 0.2] ./ (0.8 + 0.3 + 0.28 + 0.2) 
     -> [0.51,0.19,-0.18,0.13] 

在预测时间,你将需要使用字典和特征提取(清理/ n元生成同样的方式/将n-gram映射到ID),以便您的模型了解输入。

+0

这非常有用。最后一个问题,你如何将整数映射到神经元?我假设将一定数量的频繁n-gram映射到一定数量的输入神经元。但是,假设有500个n-gram跟踪,#450和#451可能是完全不同的术语,但当标准化为-1和1之间的浮点数时,它们几乎是相同的输入值。 – 0x90

+0

对,如果你想使用神经网络来获得稀疏特征,你需要在输入层和隐藏层之间有一个嵌入层。布局将类似于我的答案在这里:http://stackoverflow.com/questions/39971803/dealing-with-textual-data-for-classification/39971992#39971992(没有年龄输入和使用一个逻辑节点作为输出) 。如果您有预先训练的嵌入,就像来自word2vec的嵌入一样,您可以加载它们并计算平均嵌入,因此您始终可以获得与嵌入图层输出相同的尺寸。 – greeness

+0

完美。感谢您花时间详细介绍! – 0x90

1

您可以简单地使用sklearn to learn a TFIDF bag of words model您的文本,它返回一个稀疏矩阵n_samplesxn_features这样的:

from sklearn.feature_extraction.text import TfidfTransformer 
vectorizer = TfidfTransformer(smooth_idf=False) 
X_train = vectorizer.fit_transform(list_of_texts) 
print(X_train.shape) 

X_train是SciPy的CSR稀疏矩阵。如果您的NN实现不支持稀疏矩阵,则可以将其转换为一个numpy密集矩阵,但它可能会填充您的RAM;最好使用支持sparseinput的实现(例如,我知道Lasagne/Theano这样做)。

训练结束后,您可以使用NN的参数找出哪些特征具有高/低重量,因此对于特定标签更重要/更不重要。