### 四 聊天机器人的分类

1. 任务型机器人

1. 知识型机器人

1. 闲聊形机器人 ### 六 中文分词

#### 1 分词基本知识

jieba分词示例代码如下所示

```import jieba
text = '我爱北京天安门'
result = jieba.cut(text)  # 分词的结果是一个生成器对象
for i in result:
print(i)```

#### 2 分词模式

jieba分词库提供了三种分词模式，分别是精准模式，全模式和搜索引擎模式。

```import jieba
text = '今天天气很热，我出去转了一圈出了一身汗，还是待在家里吹空调吧'
result1 = jieba.cut(text, cut_all=False)  # 精准模式
result2 = jieba.cut(text, cut_all=True)  # 全模式
result3 = jieba.cut_for_search(text)  # 搜索引擎模式
print(list(result1))
print(list(result2))
print(list(result3))```

### 七 文本表示

#### 2 词向量表示的原理 #### 3 词向量表示小练习

```text_list = ['我', '爱', '北京', '天安门']
w1 = '我'
w2 = '天安门'

def get_vector(word):
vector = []
for i in text_list:
if word == i:
vector.append(1)
else:
vector.append(0)
return vector

print(get_vector(w1))
print(get_vector(w2))```

#### 4 用向量的方式去表达一个句子

```import jieba
text_list = ['我', '爱', '北京', '天安门']
w1 = '我爱你'
w2 = '我在天安门'
w3 = '我的家在北京'

def get_vector(word):
word_list = list(jieba.cut(word))
print(word_list)
vector = []
for i in text_list:
if i in word_list:
vector.append(1)
else:
vector.append(0)
return vector

print(get_vector(w1))  # 其中w1会受分词结果的影响非常严重，此处做简要说明
print(get_vector(w2))
print(get_vector(w3))```

#### 5 词向量自动表示库gensim

```import jieba
from gensim.models import word2vec
# 假设有文件 a.txt ,文件内容为：我爱北京天安门
f1 = open('a.txt')
# 用来存储分词之后的结果
f2 = open('b.txt', 'a')
# 假设文件内有多行文本
for line in lines:
# 替换tab，换行，空格
line.replace('/t', '').replace('/n', '').replace(' ', '')
segment = jieba.cut(line)
# 以空格拼接并写入
f2.write(' '.join(segment))
f1.close()
f2.close()
# 加载语料
sentences = word2vec.Text8Corpus('b.txt')
# 训练模型
model = word2vec.Word2Vec(sentences, min_count=1)  # 语料库太少，必须设置min_count参数为1
# 保存模型
model.save('word2vec.model')
# 表示词向量
print(model.wv['我'])
print(model.wv['天安门'])
print(model.wv['我', '天安门'])
# print(model.wv['上海'])  # 词向量必须在语料库中存在才可以表示,不存在会报错```

### 八 计算文本相似度

#### 1 欧式距离 #### 2 曼哈顿距离 #### 3 余弦相似度 #### 4 使用gensim计算文本相似度

```# 1 获取两个文本之间的相似度
sim1 = model.wv.similarity('我', '天安门')
# sim2 = model.wv.similarity('我们', '天安门')  # 报错："word '我们' not in vocabulary"
print(sim1)
# 2 找到与给定文本最想的文本，并排序
sim_text = model.wv.most_similar('我')
print(sim_text)
# 3 比较两个词条的相似性
sim3 = model.wv.n_similarity(['我', '天安门'], ['爱', '北京'])
print(sim3)```

### 九 聊天机器人实践

chapter3_1.zip

```import json
import random
import jieba
from gensim.models import word2vec
"""
1、用户输入一段文本
2、对用户输入的文本进行分词
3、把用户输入的结果与content_file.txt文件中的title字段，一一的进行相似度运算
4、获取到最大的相似度。
"""
f1 = open('fenci.txt')
f2 = open('result.txt', 'a')
for line in lines:
line.replace('\t', '').replace('\n', '').replace(' ', '')
segment = jieba.cut(line)
f2.write(' '.join(segment))
f1.close()
f2.close()
sentences = word2vec.Text8Corpus('result.txt')
model = word2vec.Word2Vec(sentences, min_count=1)
model.save('chat-bot.model')
# 3 比较两个词条的相似性
sim3 = model.wv.n_similarity(['我们', '最近'], ['因为', '不好'])
print(sim3)
while True:
text = input("请输入>>:").strip()
if text in ['拜拜', 88, 8, 'bye', '再见']:
print("有缘再见")
break
# 1 分词
words = jieba.cut(text)
user_word_list = []
for word in words:
user_word_list.append(word)
# 2 加载回复文件
content_file = open('content_file.txt')
max_sim_result = 0
max_sim_response = []
max_sim_title = ''
for line in json_content_file:
content_cut_word = jieba.cut(line['title'])
content_list = []
for w in content_cut_word:
content_list.append(w)
try:
sim_result_value = model.wv.n_similarity(user_word_list, content_list)
except:
continue

# 3 检查最大相似度的匹配
if sim_result_value > max_sim_result:
max_sim_result = sim_result_value
{"ft_lang_label":"__label__zh","ft_lang_prob":0.90316534,"math_prob":0.89662427,"size":7518,"snap":"2020-34-2020-40","text_gpt3_token_len":5219,"char_repetition_ratio":0.10087836,"word_repetition_ratio":0.06844106,"special_character_ratio":0.23038042,"punctuation_ratio":0.14597815,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9946432,"pos_list":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],"im_url_duplicate_count":[null,1,null,1,null,1,null,1,null,1,null,1,null,1,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2020-09-23T12:31:33Z\",\"WARC-Record-ID\":\"<urn:uuid:9f0f31f0-4dec-45a5-b68f-28096b83e0ab>\",\"Content-Length\":\"53616\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:79ad72d3-32e6-487f-bb16-58dced132663>\",\"WARC-Concurrent-To\":\"<urn:uuid:57ebf895-34cc-4d14-9757-a63496866057>\",\"WARC-IP-Address\":\"172.67.201.240\",\"WARC-Target-URI\":\"https://flashgene.com/archives/145689.html\",\"WARC-Payload-Digest\":\"sha1:BGWJ7ETTAE3VB7HHWJWVA6FINH3BXXC4\",\"WARC-Block-Digest\":\"sha1:5WQBJAUFYN72J4SM43RSQQN3ZB5S6XBO\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2020/CC-MAIN-2020-40/CC-MAIN-2020-40_segments_1600400210996.32_warc_CC-MAIN-20200923113029-20200923143029-00669.warc.gz\"}"}