嗨,我对Python和NLP都很陌生。我需要实现一个感知器分类器。我搜索了一些网站,但没有找到足够的信息。现在我有很多文件,我根据类别(体育,娱乐等)分组。我还列出了这些文档中最常用的单词及其频率。在一个特定的网站上有人说我必须有一些接受x和w参数的决策函数。 x显然是某种向量(我不知道w是什么)。但我不知道如何使用我所拥有的信息来构建感知器算法以及如何使用它来对我的文档进行分类。你有什么想法吗?谢谢:))
答案 0 :(得分:16)
从外部看,感知器是一个函数,它接受n
个参数(即n
- 维矢量)并产生m
个输出(即m
- 维矢量)。
在内部,感知器由神经元的层组成,使得层中的每个神经元接收来自前一层的所有神经元的输入并使用该输入来计算单个输出。第一层由n
个神经元组成,它接收输入。最后一层由m
个神经元组成,并在感知器处理完输入后保存输出。
从神经元i
到神经元j
的每个连接都有一个重量 w(i,j)
(我稍后会解释它们来自哪里)。第二层的神经元total input
的{{1}}是来自第一层的神经元的加权输出的总和。所以
p
其中total_input(p) = Σ(output(k) * w(k,p))
遍历第一层的所有神经元。通过应用激活函数从神经元的总输入计算神经元的激活。常用的激活函数是费米函数,所以
k
通过应用activation(p) = 1/(1-exp(-total_input(p))).
从神经元的激活计算神经元的输出。常用的输出函数是标识output function
(事实上,有些作者将输出函数视为激活函数的一部分)。我只想假设
f(x) = x
当计算出第二层所有神经元的输出时,使用该输出计算第三层的输出。迭代直到到达输出层。
首先,随机选择权重。然后选择一些示例(从中您可以知道所需的输出)。将每个示例馈送到感知器并计算错误,即与所需输出的距离与实际输出的距离。使用该错误更新权重。计算新权重的最快算法之一是Resilient Propagation。
您需要解决的一些问题是
output(p) = activation(p)
- 二维向量?n
神经元的隐藏层开始。第一点和第二点对分类器的质量非常关键。感知器可能正确地对示例进行分类但在新文档上失败。您可能需要进行实验。要确定分类器的质量,请选择两组示例;一个用于培训,一个用于验证。不幸的是,由于缺乏实践经验,我无法给你更详细的提示来回答这些问题。
答案 1 :(得分:7)
我认为,当您不熟悉神经网络时,试图解决NLP问题可能是一个太过分的步骤。用新语言表达的是你最不担心的事情。
我会将您链接到我的大学教授的神经计算模块slides。你需要在第2周的会话1和会话2的幻灯片。在页面底部是一个如何在C中实现神经网络的链接。通过一些修改应该能够将它移植到python。您应该注意它详细说明了如何实现多层感知器。您只需要实现单层感知器,因此请忽略任何涉及隐藏层的内容。
对x
和w
的快速解释。 x和w都是向量。 x是输入向量。 x
包含您关注的每个单词的标准化频率。 w
包含您关注的每个单词的权重。感知器的工作原理是将每个字的输入频率乘以其各自的权重并将它们相加。它将结果传递给一个函数(通常是一个sigmoid函数),该函数将结果转换为0到1之间的值.1表示感知器是肯定的,输入是它所代表的类的实例,0表示它确定输入真的不是它的类的一个例子。
使用NLP,您通常会先了解一揽子单词模型,然后再转到其他更复杂的模型。有了神经网络,希望它会学习自己的模型。这个问题是神经网络不会让你对NLP有太多了解,除了文件可以按照它们包含的单词进行分类,并且通常文档中单词的数量和类型包含大部分信息你需要对文档进行分类 - 上下文和语法不会增加太多额外的细节。
无论如何,我希望这能让你有一个更好的地方来开始你的项目。如果你仍然困在一个特定的部分,那么再问一遍,我会尽力帮助。
答案 2 :(得分:5)
你应该看一下Frabizio Sebastiani关于文本分类的this survey paper。它告诉您进行文本分类的所有最佳方法。
现在,我不会打扰你阅读整篇文章,但最后会有一张桌子,在那里他比较了很多不同人的技术如何叠加在许多不同的测试语料库上。找到它,选择最好的一个(最好的感知器,如果你的任务是专门学习如何用感知器做这个),并阅读他引用的那篇详细描述该方法的论文。
您现在知道如何构建一个好的主题文本分类器。
将Oswald给你的算法(以及你在other question中发布的)转换成代码是一个小问题编程(TM)。如果您在工作期间遇到TF-IDF等不熟悉的术语,请让您的老师通过解释这些术语来帮助您。
答案 3 :(得分:1)
MultiLayer perceptrons(针对一般分类问题的特定NeuralNet架构。)现在可以从GraphLab人员那里获得Python:
答案 4 :(得分:0)
我试着在前几天实现类似的东西。我制作了一些代码来识别英文外观和非英语。多年来我没有做AI或统计,所以这是一次霰弹枪尝试。
我的代码在这里(不想膨胀帖子):http://cnippit.com/content/perceptron-statistically-recognizing-english
输入:
尽管我不知道自己在做什么,但它似乎运作得相当好。但成功在很大程度上取决于训练数据。在我用更多的法语/西班牙语/德语文本等进行训练之前,我的成绩很差。
这是一个非常小的例子,在价值观上有很多“幸运的猜测”(例如,初始权重,偏见,门槛等)。
多个班级: 如果你想要区分多个类(即不像“A或NOT-A”那么简单),那么一种方法是为每个类使用一个感知器。例如。一个用于运动,一个用于新闻等。
将运动感知器训练成分为运动或非运动的数据。类似于新闻或非新闻等
在对新数据进行分类时,您将输入传递给所有感知器,无论哪一个返回true(或“触发”),那么这就是数据所属的类。
我在大学里使用这种方法,在那里我们使用一组感知器来识别手写字符。它非常简单并且非常有效(如果我没记错的话,准确度达到98%)。