无法理解"集体智慧"计划中的一句话

Dav*_*d D 4 python debugging

我正在研究" 编程集体智慧 ".在第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这不是作业

Gar*_*ees 6

对于已出版的书,这是非常可怕的代码!(您可以从此处下载本书的所有示例;相关文件是chapter4/nn.py.)

  • 没有docstring.这个函数应该做什么?从它的名字,我们可以猜测,它的产生在神经网络的"隐藏层"的一个节点,但什么样的作用做wordidsurls玩吗?
  • 数据库查询使用字符串替换,因此容易受到SQL注入攻击(特别是因为这与Web搜索有关,所以wordids可能来自用户查询,因此可能不受信任 - 但是,然后,也许它们是id而不是单词所以这在实践中是可以的,但仍然是一个非常糟糕的习惯.
  • 不使用数据库的强大功能:如果你想要做的就是确定数据库中是否存在密钥,那么你可能想要使用SELECT EXISTS(...)而不是要求数据库向你发送一堆你当时要去的记录无视.
  • 如果已有记录,则函数不执行任何操作createkey.没错.那是对的吗?谁能说?
  • 单词的权重按比例缩放为单词的数量,但网址的权重是常量0.1(可能总是有10个网址,但len(urls)这里的缩放风格会更好).

我可以继续,但最好不要.

无论如何,为了回答你的问题,看起来这个函数正在为神经网络的隐藏层中的节点添加数据库条目.我认为,这个神经网络有输入层中的单词和输出层中的URL.该应用程序的想法是尝试训练神经网络以基于查询中的单词找到良好的搜索结果(URL).查看trainquery带有参数的函数(wordids, urlids, selectedurl).据推测(因为没有文档字符串,我必须猜测)wordids是用户搜索的单词,urlids是搜索引擎为用户提供的URL,selectedurl是用户选择的URL .我们的想法是训练神经网络以更好地预测用户将选择哪些URL,从而将这些URL放在未来的搜索结果中.

因此神秘的代码行阻止了在隐藏层中创建的节点,其中链接指向输入层中的三个以上节点.在搜索应用程序的上下文中,这是有道理的:在过于专业化的查询中训练网络没有意义,因为这些查询不会经常重复,以使培训值得.