借问师友何处有,门童遥指新手村 | 关于 @cn-hello 小友的来历

借问师友何处有,门童遥指新手村 | 关于 @cn-hello 小友的来历

最近,CN区多了一位叫 @cn-hello 的小朋友,自称是CN区的小门童,每天在CN区路口守望,看到新人便上去提供一些建议,比如:“少侠,我看你能量很少了啊,休息会来村里喝杯茶坐坐吧” ,“那个谁,请你不要抄别人文章啊,会被举报的啊”,……,顺便给新人点个小小的赞。‌


随后又开始忽悠新人:“少年,我看你骨骼清奇,这本《Steem指南》似乎很适合你,10块钱卖你了吧?什么,没钱?那白送你了。” / “小伙,我们村里藏龙卧虎、灵气充沛,只要你肯按时做作业,可保你练成盖世神功,你来还是来还是来?”‌


他看到新人通常都很热情,但新人有时却一脸懵逼,不明白这货是干嘛来了。。。但cn-hello却很自我,每天都要炫耀一下自己勾搭了几位新人。。。‌


其实,@cn-hello 原来是一为牛角挂书的小牧童,本是勤于读书问道解惑的,但有了一些学问之后,却有些好为人师,看到迷途之人,免不了希望上前寒暄两句、指教一二。结果就从牧童变成了门童,负责村中的接引、指路一事了。‌


本文以下简单介绍一下他的来历,相关的一些想法,以及之后的计划。欢迎大家给这位小朋友提供建议。




image source: Wikipedia – 颐和园长廊彩绘 | CC BY-SA 2.0



小门童的介绍


来历


设计 @cn-hello 这个机器人(bot)的意义是颇为直接的,相信很多人也遇到过这个场景:刚来Steem发帖的时候,兴冲冲发了一个帖子,却无人问津,想要找前辈们请教一下,却不知道应该找谁,到其他作者或大佬帖子下留言,也不见得会被回复。所以cn-hello最初的功能便是为了主动发现身处迷雾之中的新人,告诉他们第一步该怎么走、接下来该怎么做、加入什么组织。‌


然而,本质上说 @cn-hello 也只是另一个欢迎机器人罢了(yet another welcome bot),有些欢迎机器人也确实并不令人喜欢,但或许也有一些差异:‌


  1. 他只关注用中文发帖的新人,只给中文用户留言;提供的建议也只用中文表达;
  2. 他提供的帮助信息,如新手村 @team-cn,如《Steem指南》,都是专为中文社区的新人们所创建的,更有针对性与亲切感
  3. 与其他某些欢迎机器人(welcome bot)相比,他并不以私利为目的而留言或点赞,他不发广告、不求赞,只是希望更好的发现和帮助新人。

虽然只运行了几天,但在帮助新人获取信息、找到团体方面也确实有一些帮助,也帮助我们更好地了解和认识了新人们的生存状态。在后文我们会进一步介绍这些内容。‌


—-‌


除了上面提到的这个显而易见的痛点,开始要写这个机器人的动机也有两方面:‌


  1. 一方面是在讨论《Steem指南》相关问题时,发现虽然有《指南》但很多人还是没有阅读的习惯,所以考虑是否可以实现一个发布攻略的小助手(advisor),根据新人发帖的情况,给他提供相应的修改建议;
  2. 另一方面,源于和村长 @ericet 的交流,关于平时是如何找新人进村的,村长说一般是自己去看的,没用什么工具。所以我想可以写个工具和机器人自动化这部分工作,村长也提到已经注册了 @cn-hello 这个账号,想来做类似的事情。

于是大概简单实现了目前的这位 @cn-hello 小门童,或许以后会有更多的功能,也欢迎大家提供建议,目的仍然是切实帮助到新手们。‌


—-‌


实际上,#cn-hello 过去是一个CN区新人常用的自我介绍的标签,最近似乎用的人少了很多。这里用 @cn-hello 作账户,用意也在于帮助新人,所以在意义上较为接近的。‌



功能


目前 @cn-hello 主要有两方面的功能:‌


(1)欢迎新人并提供建议


搜索1天内在 #cn 标签下用中文发表帖子的新人,并在他们的文章下回复新人可能遇到的困难,以及相关的建议,如下图所示:




image source: screenshot from the account @cn-hello ‘s comment‌


特别地,由于很多新人不了解RC的消耗,回复中添加了新人目前的能量可以发表的文章或回帖的总数,以及每天恢复的能量能发帖的数量。‌


关于中文区新人的定义,目前采用的是如下规则:‌


  1. 声望在 [25, 35] 的区间内;
  2. SP < 100;
  3. 帖子使用中文发表


(2)统计1日和7日的新人动态


现在 @cn-hello 定时于北京时间每日晚10点运行,首先搜索新人并回复,然后发布新人相关的统计信息,如2019年05月10日的帖子。统计信息包括:‌


  1. 文章推荐:今日发布帖子的新人以及推荐其中一篇帖子(通常是最新一篇);
  2. 7日新人统计:罗列过去7日发现的新人,以及他们的声望、能量(RC)、帖子数、粉丝数等信息。

这部分统计设计时主要是为了方便老用户为新人提供建议或支持,也可以帮助关注自己在初期的一些关键指标。如下图所示:




image source: screenshot from the account @cn-hello ‘s post




image source: screenshot from the account @cn-hello ‘s post‌


—-‌


目前功能是较为简单的,但对于发现新人,确实也有一些帮助;村长也会根据统计和@的通知,找到新人的帖子并帮助一些新手加入村内。‌


同时,也存在一些问题,似乎并不太容易解决,例如:‌


  1. 获取反馈困难:一般很难知道新手是不是读了 @cn-hello 的建议,以及对建议的反馈如何;确实也有一些新人看到了相关的回复,然后主动联系,但总体来说相当少;
  2. 新手可能不理解规则或建议:推荐的新手的文章有一部分是有抄袭或搬砖的问题的,虽然回复新人时指出了这一点,但可能新手并不理解实际的情况或不愿意相信,依然我行我素,结果还是被踩了。


源码


总体来说,这是一个较为简单的工程,但基本包括了一个论坛机器人常见的功能:监控、过滤、文本分析、回复、点赞、发表文章、通知,等等。‌


下面是本项目的源代码,开源在 @steem-guides 的GitHub账户下。‌



该机器人提供了如下命令,可供执行:

1
2
3
4
5
6
7
8
Available tasks:

cn-hello.reply reply to a post by cn-hello
cn-hello.search search the latest posts by newbies
cn-hello.summarize publish summary post for daily and weekly update
cn-hello.vote vote a post by cn-hello
cn-hello.welcome send welcome messages to newbies
steem.list-posts list the post by account, tag, keyword, etc.



代码较为简单,这里不赘述。但或许有一些基础类可以被复用,这里简单提一下:‌


  1. steem 模块
    1. collector.py:封装了以账户、标签、天数、数量等查询文章和回复的基本方法,如有需要做此类查询的,或许可以复用其中的 get_posts() / get_comments();
    2. comment.py 和 account.py:封装了一些常用操作,如各类常用信息的查询、是否被某人赞或者踩、纯文本的提取等;
  2. data 模块
    1. page_language.py:对文本使用的语言检测的封装;
    2. reader.py:可帮助实现监听某tag最新文章;
  3. cn_hello 模块
    1. bot.py, command.py, message.py, newbies.py: 稍作修改可创建一个新的机器人。


1
2
3
4
5
6
├── cn_hello
│ ├── __init__.py
│ ├── bot.py # the behaviors of the bot
│ ├── command.py # the commands that trigger the bot to act
│ ├── message.py # the messages for the bot to speak
│ └── newbies.py # the data operations of newbies



对于如何安装、执行命令等,可以参考GitHub repo的readme中的介绍。‌


所以,如果希望自己快速创建一个机器人实现点赞、回复、监控、通知等功能,或许可以参考这里的开源代码。‌


—-‌


关于识别中文,这里直接使用了 langdetect 这个 package,是对https://code.google.com/p/language-detection/ 项目的python移植。‌


具体可参见Language Detection Library for Java 中对算法的介绍。其核心是采用了Naive Bayes with character n-gram,计算不同字符拼写特征在哪种语言中出现的概率最高。‌


核心代码在项目的detector.py文件中,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
def get_probabilities(self):
if self.langprob is None:
self._detect_block()
return self._sort_probability(self.langprob)

def _detect_block(self):
self.cleaning_text()
ngrams = self._extract_ngrams()
if not ngrams:
raise LangDetectException(ErrorCode.CantDetectError, 'No features in text.')

self.langprob = [0.0] * len(self.langlist)

self.random.seed(self.seed)
for t in xrange(self.n_trial):
prob = self._init_probability()
alpha = self.alpha + self.random.gauss(0.0, 1.0) * self.ALPHA_WIDTH

i = 0
while True:
self._update_lang_prob(prob, self.random.choice(ngrams), alpha)
if i % 5 == 0:
if self._normalize_prob(prob) > self.CONV_THRESHOLD or i >= self.ITERATION_LIMIT:
break
if self.verbose:
six.print_('>', self._sort_probability(prob))
i += 1
for j in xrange(len(self.langprob)):
self.langprob[j] += prob[j] / self.n_trial
if self.verbose:
six.print_('==>', self._sort_probability(prob))

def _extract_ngrams(self):
'''Extract n-grams from target text.'''
RANGE = list(xrange(1, NGram.N_GRAM + 1))

result = []
ngram = NGram()
for ch in self.text:
ngram.add_char(ch)
if ngram.capitalword:
continue
for n in RANGE:
# optimized w = ngram.get(n)
if len(ngram.grams) < n:
break
w = ngram.grams[-n:]
if w and w != ' ' and w in self.word_lang_prob_map:
result.append(w)
return result

code from langdetect project | license: Apache License 2.0‌

未来

目前 @cn-hello 小门童的工作主要以接待和引导新人为主。之后的拓展依然以尽力帮助新人为目的,主要的改进可能在以下几个方面,但总体而言目前的优先级并不是非常高:‌

  1. 提供改进建议:根据作者对标签的使用、收益的情况、文章的主题等,提供在标签使用、活动参与等方面的建议,将《Steem指南》中的特定章节也会一并推送;
  2. 优化新人统计信息:给新人推荐其他steem数据分析平台的链接,方便新人了解掌握自己主要的状态和潜在的改进方向,可能只看统计帖子并不是很方便或有效;
  3. 优化文章推荐:推荐新人高质量的文章,以及包括提高新人在snax等注意力奖励平台上的收益等。这点似乎很多机器人都在做了,所以或许并不是 @cn-hello 的重点。

对小门童有任何建议,或者希望他还能帮新人们做些什么,请在文章下面留言哦~

小门童的思考

对新人的观察

透过 @cn-hello 每日对新人的访问和记录,我们也能获得一些关于新人的观察:‌

  1. 搬砖的倾向:在过去7人接待的28位新人中,至少有5位由于搬砖(抄袭)的问题声望被踩到25以下。一方面,我们的提醒没有达成特别好的效果;另一方面,新人不了解规则并希望轻松撸币容易有搬砖的倾向。
  2. “老”新人:大部分 @cn-hello 找到的新人都是1个月以内的创建的(18 / 28),但也有部分账户(6 / 20)已经创建了 1年左右或以上的。或许当时新人来访时,没有很快找到融入社区的方式,所以一直呈现若离若即的状态,希望 cn-hello能帮助缓解这一问题,目前看来似乎也并不容易。
  3. 积极的新人:目前积极回应 @cn-hello 的新人只有 (6 / 28)个,并不算很多,但能得到一些有效回应,也算部分完成任务了。

对新人不够友好(同时也是为了防止小号和机器人的泛滥),是Steem的一个严重的问题,也是比较奇怪的地方,但恐怕也是无奈之举。从实际上确实阻碍了新生力量的入场,给新玩家设置了较高的门槛。或许本质上这是西方文明“人性恶”的假设在作怪吧。‌

为了对抗新人面对的挑战,小门童表示不打算放弃新人“拯救”计划。‌

机器人的印象

小门童 @cn-hello 是机器人,但令他感到不解的是,steem上很多机器人并不打算遵循阿基莫夫的机器人三大定律或者四大定律,甚至恶行昭彰。

第零法则:机器人不得伤害整体人类,或坐视整体人类受到伤害;

第一法则:除非违背第零法则,否则机器人不得伤害人类,或坐视人类受到伤害;

第二法则:除非违背第零或第一法则,否则机器人必须服从人类命令;

第三法则:除非违背第零、第一或第二法则,否则机器人必须保护自己。


‌总体来说,steem上机器人给人的整体印象是不够正面的,既不智能、也不正义(不仁、不智)。‌

事实上,像“三大定律”这样义务化的伦理确实不适合steem上的机器人,他们不过是人的延伸,并不具有被编码的“道德”。或许在可预见的未来,人工智能的潜在危害也不过是“恶”的延伸,问题不在与机器本身有多智能,而首先在于设计和使用它的人是否能约束自身的贪婪和享乐的倾向。‌

—-‌

如果想要进一步了解steem上的机器人,《Steem指南》的机器人篇对于机器人有一些不完全的介绍,可作参考。‌


在帮助新人方面,@cn-hello 也只不过是其中之一。CN区还有很多可爱的机器人,有些依然活跃,有些则已经进入休假状态,比如 @cn-cutie.pie 和 @cn-naughty.boy。‌

之前的一些过去关于机器人问题的讨论,或许也可以作为参考:‌

  1. 聊聊机器人🤖 / Robots on STEEMIT
  2. steemit 还是机器人的天下
  3. 机器人是否会破坏steemit上的生态平衡?

‌@maiyude 的机器人教程,也可供初学者阅读,我们稍后也会整合到《Steem指南》中。‌

  1. steem-python 介绍:(1)(2)
  2. 点赞机器人开发:(1)(2)(3)

—-‌

虽然对于steem上的机器人存在许多争议,但所谓“自反而缩,虽千万人,吾往矣”,小门童希望能尽自己的一点绵薄之力,便已经足够了 :)‌

参考文献

  1. Wikipedia,机器人三定律
  2. Shuyo NakataniLanguage Detection Library for Java,2010年



Posted from my blog with SteemPress : https://robertyan.000webhostapp.com/2019/05/%e5%80%9f%e9%97%ae%e5%b8%88%e5%8f%8b%e4%bd%95%e5%a4%84%e6%9c%89%ef%bc%8c%e9%97%a8%e7%ab%a5%e9%81%a5%e6%8c%87%e6%96%b0%e6%89%8b%e6%9d%91-%e5%85%b3%e4%ba%8e-cn-hello-%e5%b0%8f%e5%8f%8b%e7%9a%84


This page is synchronized from the post: 借问师友何处有,门童遥指新手村 | 关于 @cn-hello 小友的来历

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×