我正在研究" 编程集体智慧 ".在第4章中,Toby Segaran构建了一个人工神经网络.本书页面上显示以下功能:
def generatehiddennode(self,wordids,urls):
if len(wordids)>3: return None
# Check if we already created a node for this set of words
sorted_words=[str(id) for id in wordids]
sorted_words.sort()
createkey='_'.join(sorted_words)
res=self.con.execute(
"select rowid from hiddennode where create_key='%s'" % createkey).fetchone()
# If not, create it
if res==None:
cur=self.con.execute(
"insert into hiddennode (create_key) values ('%s')" % createkey)
hiddenid=cur.lastrowid
# Put in some default weights
for wordid in wordids:
self.setstrength(wordid,hiddenid,0,1.0/len(wordids))
for urlid in urls:
self.setstrength(hiddenid,urlid,1,0.1)
self.con.commit()
Run Code Online (Sandbox Code Playgroud)
我无法理解的是这个函数第一行的原因:'if len(wordids> 3):return None`.是否需要稍后删除调试代码?
PS这不是作业
对于已出版的书,这是非常可怕的代码!(您可以从此处下载本书的所有示例;相关文件是chapter4/nn.py.)
wordids和urls玩吗?wordids可能来自用户查询,因此可能不受信任 - 但是,然后,也许它们是id而不是单词所以这在实践中是可以的,但仍然是一个非常糟糕的习惯.SELECT EXISTS(...)而不是要求数据库向你发送一堆你当时要去的记录无视.createkey.没错.那是对的吗?谁能说?0.1(可能总是有10个网址,但len(urls)这里的缩放风格会更好).我可以继续,但最好不要.
无论如何,为了回答你的问题,看起来这个函数正在为神经网络的隐藏层中的节点添加数据库条目.我认为,这个神经网络有输入层中的单词和输出层中的URL.该应用程序的想法是尝试训练神经网络以基于查询中的单词找到良好的搜索结果(URL).查看trainquery带有参数的函数(wordids, urlids, selectedurl).据推测(因为没有文档字符串,我必须猜测)wordids是用户搜索的单词,urlids是搜索引擎为用户提供的URL,selectedurl是用户选择的URL .我们的想法是训练神经网络以更好地预测用户将选择哪些URL,从而将这些URL放在未来的搜索结果中.
因此神秘的代码行阻止了在隐藏层中创建的节点,其中链接指向输入层中的三个以上节点.在搜索应用程序的上下文中,这是有道理的:在过于专业化的查询中训练网络没有意义,因为这些查询不会经常重复,以使培训值得.