一个AI初学者尝试制作专业人生小姐姐机器人
这篇文章是《2016年职业少女临时工Advent Calendar》第10天的文章。
首先
由于这本身就是一个微妙的AI问题,所以标题可能也是错误的可能性。
我收集了Pro生的Twitter发言,尝试制作了一个Pro生ChatBot。
如果在Slack中这样发言,Pro生会回复你这样的东西。
经过
在公司的 Slack 上,有一个叫做某博主的 Bot 频道被创建了出来,听说他正在用 Twitter 制作 ChatBot。这就意味着我们只能从 Pro 生的 Twitter 上制作 ChatBot!因此,我们开始动手制作了。
试试做一下
据说可以按照以下大致流程来制作。
-
- 使用Twitter的爬虫将发言内容整理到数据库中,
-
- 将数据库的数据输入到ElasticSearch,
- 使用Python的SlackBot将发言内容传递给ElasticSearch,并将返回的文本输出。
由于几乎所有同事都已经制作好了酱料,所以我只是直接使用了他们的酱料,因此这次跳过了详细的说明…
准备好
由于不想在本机上运行Elasticsearch等,所以这次我们将使用Vagrant在CentOS上进行设置并运行。
Vagrant的准备工作(CentOS)
cd <適当なディレクトリ>
mkdir pronama-chan-bot && cd $_
vagrant init <CentOSのBoxファイル名>
vagrant up
vagrant ssh
sudo yum update -y
从现在开始,在CentOS内进行工作。
Java的安装
由于安装所述的分析工具-kuromoji似乎需要Java,因此需要安装Java。
sudo yum install -y wget
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm
sudo rpm -ivh jdk-8u65-linux-x64.rpm
java -version
安装ElasticSearch
※ ElasticSearch 是什么
据说Elastic公司提供了一种全文搜索引擎(用于从大量文档数据中搜索包含目标词的文档数据的机制)。
请参考这个链接进行安装
sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
sudo vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
sudo yum install -y elasticsearch
安装ElasticSearch的插件
# 日本語の全文検索対応のためにkuromojiをインストール
sudo /usr/share/elasticsearch/bin/plugin install analysis-kuromoji
# neologdというipa辞書の拡張版?とやらを使うのでインストール
sudo /usr/share/elasticsearch/bin/plugin install org.codelibs/elasticsearch-analysis-kuromoji-neologd/2.4.1
# 結果をWebブラウザで見ることが出来るプラグイン
sudo /usr/share/elasticsearch/bin/plugin install polyfractal/elasticsearch-inquisitor
# ElasticSearchのモニタリングが出来るプラグイン
sudo /usr/share/elasticsearch/bin/plugin install royrusso/elasticsearch-HQ
※ 我在搜索引擎上查找并写下了每个插件的说明,所以可能存在错误的可能性m(_ _)m
ElasticSearch的配置设定
sudo vi /etc/elasticsearch/elasticsearch.yml
请按照以下方式进行更改
http.compression: true
network.publish_host: "0.0.0.0"
network.host: "0.0.0.0"
network.bind_host: "0.0.0.0"
transport.tcp.port: 9300
transport.tcp.compress: true
http.port: 9200
启动设置
sudo chkconfig elasticsearch on
sudo service elasticsearch start
使用pyenv进行Python的安装
sudo yum install -y git
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
pyenv install anaconda3-4.1.1
pyenv rehash
pyenv global anaconda3-4.1.1
python --version
※ 这里只是简单解释,因为我们只是简单地执行了同事的源代码。
执行Twitter爬虫
使用Python的Twitter API库tweepy,获取过去的时间线并存储到数据库中。
# Twitter APIの設定
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)
# TLの取得(全てのTLが取得出来るまで以下を実行)
statuses = api.user_timeline('pronama', max_id = None, count = 200)
# 取得したデータをDB保存用に加工
# 省略
# 取得したTLをDBに保存
# 省略
将爬取结果的数据库输入ElasticSearch。
设置模板吗?
将JSON设置为localhost:9200/_template/,然后就可以了。
在模板中设置索引名称,并进行了如kuromoji等分词器的设置。我对这部分还不太了解,所以稍后会进行调查(不需要进行旗标)。
一旦删除索引。
如果将localhost:9200/删除,就可以了。
将从数据库中取出的数据暂时保存到JSON文件中。
使用Python将数据库中的数据转换为JSON。
将json数据进行批量插入
在本地主机上的9200端口上通过POST方法将<json数据>以二进制数据发送到/speech/_bulk。
因为到目前为止ElasticSearch本身应该已经在运行,所以我们尝试运行以下命令来确认结果是否返回。
curl -XGET 'http://localhost:9200/<index_name>/_search?pretty' -d '
{
"query": {
"function_score": {
"functions": [
{
"random_score": {
"seed" : "999999999"
}
}
],
"query": {
"query_string": {
"query": "text.kuromoji:<テキスト>^100 OR text.2gram:$<テキスト>^10"
}
},
"score_mode": "multiply"
}
},
"size": 1,
"sort": {
"_score": {
"order": "desc"
}
},
"track_scores": true
}
'
太好啦!虽然回应是“Ya-hoo”,但好像起作用了!
SlackBot的设置
然后,将其设置为SlackBot。
在Slack上注册Bot用户
你可以通过”Add Configuration”来注册Bot用户。每个项目都可以随意填写。本次我们将以”@pronama_chan”的名字进行注册。
请务必将在下一个页面显示的“API Token”记下来。
在Slack上创建一个Bot频道
不要忘记邀请使用↑创建的@pronama_chan。
创造一个SlackBot
让我们使用Python的Slackbot库创建一个Slack Bot。
from slackbot.bot import Bot
from slackbot.bot import respond_to,default_reply
bot_response(userid, word):
# ElasticSearchにPOSTする
response = requests.post(
'http://{}/{}/_search'.format(hostname, index_name),
<wordから生成したElasticSearchに投げるJSON文字列>.encode('utf-8'))
# POSTしたものから
return <responseからhitした文字列を抽出したもの>
@respond_to('(.*)')
def chat(message, word):
response = bot_response(message._get_user_id(), word)
message.reply(response)
def main():
bot = Bot()
bot.run()
if __name__ == "__main__":
main()
我试着做了一下
我试着从Slack发送
开心地大喊:终于来了!(≧▽≦)/
最后
在Web上,我作为一个AI初学者,终于成功地创建了名为“Prosei”的聊天机器人。虽然使用了平时不怎么用到的技术,但是感觉既有趣又累人啊。。。
以上!