9

嗨,我对 Python 和 NLP 很陌生。我需要实现一个感知器分类器。我搜索了一些网站,但没有找到足够的信息。现在我有一些文件,我根据类别(体育、娱乐等)进行了分组。我还列出了这些文档中最常用的单词及其频率。在一个特定的网站上,有人说我必须有某种接受参数 x 和 w 的决策函数。x 显然是某种向量(我不知道 w 是什么)。但我不知道如何使用我必须构建感知器算法的信息以及如何使用它对我的文档进行分类。你有什么想法吗?谢谢 :)

4

5 回答 5

16

感知器的样子

从外部看,感知器是一个接受n参数(即一个n维向量)并产生m输出(即一个m维向量)的函数。

在内部,感知器由多层神经元组成,这样一层中的每个神经元都接收来自前一层所有神经元的输入,并使用该输入来计算单个输出。第一层由n神经元组成,它接收输入。最后一层由m神经元组成,并在感知器完成输入处理后保存输出。

如何从输入计算输出

i从神经元到神经元的每个连接j都有一个权重 w(i,j)(我稍后会解释它们的来源)。第二层total input神经元p的 是第一层神经元的加权输出之和。所以

total_input(p) = Σ(output(k) * w(k,p))

其中k运行在第一层的所有神经元上。神经元的激活是通过应用激活函数从神经元的总输入中计算出来的。一个常用的激活函数是费米函数,所以

activation(p) = 1/(1-exp(-total_input(p))).

神经元的输出是通过应用一个神经元的激活来计算的output function。一个经常使用的输出函数是恒等式f(x) = x(确实有些作者将输出函数视为激活函数的一部分)。我只是假设

output(p) = activation(p)

当计算出第二层所有神经元的输出时,使用该输出计算第三层的输出。迭代直到到达输出层。

权重从何而来

首先,权重是随机选择的。然后选择一些示例(从中您知道所需的输出)。将每个示例输入感知器并计算误差,即实际输出与期望输出相差多远。使用该错误来更新权重。计算新权重的最快算法之一是弹性传播

如何构建感知器

您需要解决的一些问题是

  1. 文档的相关特征是什么?如何将它们编码为n-维向量?
  2. Which examples should be chosen to adjust the weights?
  3. How shall the output be interpreted to classify a document? Example: A single output that yields the most likely class versus a vector that assigns probabilities to each class.
  4. How many hidden layers are needed and how large should they be? I recommend starting with one hidden layer with n neurons.

The first and second points are very critical to the quality of the classifier. The perceptron might classify the examples correctly but fail on new documents. You will probably have to experiment. To determine the quality of the classifier, choose two sets of examples; one for training, one for validation. Unfortunately I cannot give you more detailed hints to answering these questions due to lack of practical experience.

于 2011-01-12T00:35:25.337 回答
7

我认为,当你不熟悉任何一种神经网络时,尝试用神经网络解决 NLP 问题可能有点过头了。你用一种新的语言来做这件事是你最不担心的。

我会将您链接到我的大学教授的神经计算模块幻灯片。您将需要第 2 周的第 1 次会议和第 2 次会议的幻灯片。页面底部是如何在 C 中实现神经网络的链接。通过一些修改应该能够将其移植到 python。您应该注意,它详细说明了如何实现多层感知器。你只需要实现一个单层感知器,所以忽略任何关于隐藏层的东西。

x和的快速解释w。x 和 w 都是向量。x 是输入向量。x包含您关注的每个单词的标准化频率。w包含您关注的每个单词的权重。感知器通过将每个单词的输入频率乘以其各自的权重并将它们相加来工作。它将结果传递给一个函数(通常是一个 sigmoid 函数),该函数将结果转换为 0 到 1 之间的值。1 表示感知器是肯定的,输入是它所代表的类的实例,0 表示确定输入真的不是它的类的一个例子。

使用 NLP,您通常会先了解词袋模型,然后再学习其他更复杂的模型。希望借助神经网络,它可以学习自己的模型。这样做的问题是神经网络不会让你对 NLP 有太多的了解,除了文档可以按它们包含的单词进行分类,而且通常文档中单词的数量和类型包含你的大部分信息需要对文档进行分类——上下文和语法不会增加太多额外的细节。

无论如何,我希望这为您的项目提供了一个更好的起点。如果您仍然卡在某个特定部分,请再次询问,我会尽力提供帮助。

于 2011-01-11T23:20:09.170 回答
5

You should take a look at this survey paper on text classification by Frabizio Sebastiani. It tells you all of the best ways to do text classification.

Now, I'm not going to bother you to read the whole thing, but there's one table near the end, where he compares how lots of different people's techniques stack up on lots of different test corpora. Find it, pick the best one (the best perceptron one, if you assignment is specifically to learn how to do this with perceptron), and read the paper he cites that describes that method in detail.

You now know how to construct a good topical text classifier.

Turning the algorithm that Oswald gave you (and that you posted in your other question) into code is a Small Matter of Programming (TM). And if you encounter unfamiliar terms like TF-IDF while you're working, ask your teacher to help you by explaining those terms.

于 2011-01-12T19:05:45.850 回答
1

多层感知器(用于一般分类问题的特定 NeuralNet 架构。)现在可从 GraphLab 人员那里获得 Python:

https://dato.com/products/create/docs/generated/graphlab.deeplearning.MultiLayerPerceptrons.html#graphlab.deeplearning.MultiLayerPerceptrons

于 2015-03-25T02:58:48.717 回答
0

前几天我尝试实现类似的东西。我编写了一些代码来识别看起来是英文的文本与非英文的文本。我已经很多年没有做过 AI 或统计了,所以这有点像霰弹枪的尝试。

我的代码在这里(不想让帖子膨胀):http ://cnippit.com/content/perceptron-statistically-recognizing-english

输入:

  • 我拿一个文本文件,把它分成三元组(例如“abcdef”=> [“abc”,“bcd”,“cde”,“def”])
  • 我计算每个的相对频率,并将其作为感知器的输入(所以有 26^3 个输入)

尽管我并不真正知道自己在做什么,但它似乎运作良好。不过,成功在很大程度上取决于训练数据。在我用更多的法语/西班牙语/德语文本等进行训练之前,我的结果很差。

不过,这是一个非常小的例子,在值上有很多“幸运的猜测”(例如,初始权重、偏差、阈值等)。

多个类: 如果您想要区分多个类(即不像“是 A 或不是 A”那么简单),那么一种方法是为每个类使用一个感知器。例如。一种用于运动,一种用于新闻等。

在分组为运动或非运动的数据上训练运动感知器。类似新闻或非新闻等。

在对新数据进行分类时,您将输入传递给所有感知器,无论哪一个返回 true(或“触发”),这就是数据所属的类。

我在大学时就使用过这种方法,在那里我们使用了一组感知器来识别手写字符。它很简单,而且工作得非常有效(如果我没记错的话,准确率 > 98%)。

于 2011-03-31T00:13:02.883 回答