基于TCP协议实现校园百科知识自动聊天程序

方法一:使用字典存储数据

基于TCP的自动聊天程序是一种通过建立TCP连接来实现聊天功能的程序。它通常包括两个部分:客户端和服务器端。客户端负责与用户交互,接收用户输入并发送消息到服务器端;服务器端负责接收客户端发来的消息并进行处理,然后将处理后的消息发送回客户端。

首先,需要使用 Python 的 socket 模块来建立 TCP 连接。这是一个内置的模块,可以方便地处理网络通信。具体的,需要创建一个 socket 对象,并使用它的 bind()listen()accept() 方法来建立服务器端。然后,可以创建另一个 socket 对象,并使用它的 connect() 方法来建立客户端。这两个 socket 对象之间就可以进行通信了。

其次,需要准备至少 30 条校园百科知识问答语句。可以把这些语句存储在一个数组中,每次服务器端收到一条问题,就在字典中查找匹配的答案,并将其发送给客户端。如果想要更复杂的存储方式,可以使用数据库来存储这些语句,并在运行时通过查询来获取答案。

最后,一个交互式的界面将输入的信息发送给服务器端。服务器端收到消息后,就可以根据提前准备的知识库来回答问题。当客户端和服务器端的通信完成后,可以通过 socket 对象的 close() 函数断开 TCP 连接。

服务器端

import socket
import threading
import time
def DealClient(sock, addr):
    print("Accept new connection from %s:%s..." % addr)
    sock.send(b"you:")
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        # 分词
        words = data.decode('utf-8')
        # 根据分词查询字典
        if words in dict:
            sock.send(dict[words].encode('utf-8'))
        else:
            sock.send("Sorry, I don't know".encode('utf-8'))
    sock.close()
    print("Connection from %s:%s closed." % addr)
# 初始化服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口
s.bind(('192.168.0.104', 9995))
s.listen(5)
print("Waiting for connection...")
# 存储问答语句
dict = {
    "你叫什么名字?": "我叫李修基。",
    "你是哪个学校的?": "西北民族大学",
    "西北民族大学环境好吗?": "非常好",
    "学校在哪里?": "学校在甘肃省兰州市",
    "你们校有多少学生?": "现有学生约2.5万人",
    "学校有多少教室?": "学校有约1000间教室",
    "学校有多少体育馆?": "学校有3个体育馆",
    "学校有多少食堂?": "学校有12个食堂",
    "学校有多少实验室?": "学校有约100个实验室",
    "学校有多少住宿楼?": "学校有31个住宿楼",
    "学校有多少社团?": "学校有约200个社团",
    "学校有多少学院?": "学校有30多个学院",
    "学校有多少教工?": "学校有约3000多名教工",
    "学校有多少国际学生?": "学校有约6000多名国际学生",
    "学校有多少行政办公楼?": "学校有约20多个行政办公楼",
    "学校有多少报告厅?": "学校有约10个报告厅",
    "学校有多少体育场?": "学校有4个体育场",
    "学校有多少风景点?": "学校有约20个风景点",
    "学校有多少宿舍?": "学校有约5000多间宿舍",
    "学校有多少艺术团?": "学校有约10个艺术团",
    "学校有多少园林?": "学校有约20个园林",
    "学校有多少实验室中心?": "学校有约20个实验室中心",
    "学校有多少运动场?": "学校有约20个运动场",
    "学校有多少农场?": "学校有约10个农场",
    "学校有多少健身房?": "学校有约10个健身房",
    "学校有多少实训室?": "学校有约20个实训室",
    "学校有多少游泳池?": "学校有约10个游泳池",
    "学校有多少商店?": "学校有约50个商店",
    "学校有多少展览厅?": "学校有约20个展览厅",
    "你好": "HELLO",
}
while True:
    # 接受一个新连接
    sock, addr = s.accept()
    # 创建新线程来处理TCP连接
    t = threading.Thread(target=DealClient, args=(sock, addr))
    t.start()

1. 导入库

首先,服务器程序导入了三个库:

socket: 这是 Python 的标准库,用于创建和使用网络套接字。

threading: 这是 Python 的标准库,用于创建和管理线程。

time: 这是 Python 的标准库,用于操作时间和日期。

2. 初始化服务器, 然后,服务器程序创建了一个套接字:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

其中,AF_INET 表示使用 IPv4 协议,SOCK_STREAM 表示使用流式套接字。然后,服务器程序绑定地址和端口,并开始监听客户端连接:

s.bind(('192.168.0.104', 9995))

s.listen(5)

其中,('192.168.0.104', 9995) 表示地址和端口,其中 127.0.0.1 是本机的回环地址,9996 是一个随意选择的端口。listen() 函数的参数 5 表示最多可以有 5 个客户端同时连接到服务器。

3. 处理客户端连接

然后,服务器程序进入一个死循环,每次循环都会接受一个新的客户端连接:

while True:

sock, addr = s.accept()

accept() 函数会阻塞线程,直到有新的客户端连接到服务器。如果有新的客户端连接,accept() 函数会返回一个新的套接字和客户端的地址信息。

然后,服务器程序会创建一个新的线程来处理这个连接:

t = threading.Thread(target=DealClient, args=(sock, addr))

t.start()

这样,服务器就可以同时处理多个客户端连接了。

4. DealClient() 函数

DealClient() 函数是用来处理客户端连接的函数。它的参数是一个套接字和客户端的地址信息。

首先,DealClient() 函数会打印出一条欢迎信息,并发送给客户端:

print("Accept new connection from %s:%s..." % addr)

sock.send(b"you:")

然后,DealClient() 函数进入一个死循环,每次循环都会接收客户端发送的数据:

while True:

data = sock.recv(1024)

recv() 函数会阻塞线程,直到接收到客户端发送的数据。如果接收到的数据为空,或者数据内容为“exit”,则退出循环。否则,服务器程序会对接收到的数据进行处理。

在这里,服务器程序先对数据进行了解码

words = data.decode('utf-8')

然后,服务器程序查询了一个字典,看看这个问题是否已经被记录在字典中:

if words in dict:

    sock.send(dict[words].encode('utf-8'))

else:

    sock.send("Sorry, I don't know".encode('utf-8'))

如果问题在字典中,服务器程序就会发送相应的答案给客户端;如果问题不在字典中,服务器程序就会发送“Sorry, I don't know”给客户端。

客户端

import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect(('192.168.0.104', 9995))
while True:
    # 接收服务器消息
    data = s.recv(1024)
    print(data.decode('utf-8'))
    # 发送消息给服务器
    str = input()
    s.send(str.encode('utf-8'))
    if str == 'exit':
        break
s.close()

        上述代码首先创建了socket对象,socket.socket()函数中的两个参数AF_INET指定使用IPv4协议,SOCK_STREAM指定使用面向流的TCP协议,这样就创建了一个socket。 接着调用connect()函数来连接到远程服务器。参数('192.168.0.104', 9995)分别指定地址和端口号,这里指定的是服务器的地址和端口号,客户端会发起连接请求,服务器接受连接请求。 接下来,使用while循环,调用recv()函数来接收服务器发送的消息,并使用decode()函数将消息从字节流转换成字符串,然后使用print()函数输出消息,让客户端用户可以接收到服务器发来的消息。 最后,使用input()函数获取用户输入的消息,然后使用send()函数将消息发送给服务器,并使用encode()函数将字符串转换成字节流,发送给服务器。如果输入的消息是“exit”,则跳出循环,关闭socket连接,结束客户端程序。

实现结果:

  1. 当运行这段代码时,会输出一条“Waiting for connection...”的消息,表示服务器正在等待客户端的连接。
  2. 当客户端连接到服务器时,会输出一条“Accept new connection from xxx:yyy...”的消息,其中 xxx 和 yyy 分别表示客户端的地址和端口。
  3. 当客户端与服务器断开连接时,会输出一条“Connection from xxx:yyy closed.”的消息,其中 xxx 和 yyy 分别表示客户端的地址和端口。
  4. 用 threading 模块来创建和管理多线程。代码中可以使用 threading.Thread() 函数创建一个新的线程,并使用 start() 函数来启动线程。在此是由两个客户端与服务器端建立连接。

方法二:使用数据库存储数据

1. 客户端向服务器发起连接:客户端使用Python的socket模块创建一个TCP的socket,并向服务器发起连接,建立TCP连接。

2. 客户端发送请求消息:客户端发送需要查询的校园百科知识问题给服务器,服务器收到请求消息,并使用 jieba 库对消息进行分词。

3. 服务器从数据库中查找:服务器接收到客户端请求消息后,从数据库中查找与请求消息对应的答案,将其发送给客户端。

4. 客户端主动关闭连接:客户端收到服务器发来的回复消息,关闭连接,服务器也关闭该连接,完成TCP连接。

代码如下:

服务器端

import socket
import threading
import jieba
import sqlite3

def DealClient(sock, addr):
    # 打印接受到的新连接的地址
    print("Accept new connection from %s:%s..." % addr)
    sock.send(b"you:")
    while True:
        # 接收客户端发送的消息
        data = sock.recv(1024)
        # 如果接收到的数据为空或者收到的消息为'exit',则断开连接
        if not data or data.decode('utf-8') == 'exit':
            break
        # 对接收到的消息进行分词
        words = list(jieba.cut(data.decode('utf-8')))
        # 根据分词查询数据库,获取答案
        answer = get_answer(words)
        # 如果能够找到答案,则发送答案给客户端
        if answer:
            sock.send(answer.encode('utf-8'))
        else:
            sock.send("Sorry, I don't know".encode('utf-8'))
    # 关闭与客户端的连接
    sock.close()
    print("Connection from %s:%s closed." % addr)

def get_answer(words):
    # 建立数据库连接
    db = sqlite3.connect("data.db")
    cursor = db.cursor()
    # 查询数据库
    query = 'SELECT answer FROM qa WHERE question LIKE "%' + '%'.join(words) + '%"'
    cursor.execute(query)
    result = cursor.fetchone()
    # 关闭数据库连接
    cursor.close()
    db.close()

    # 返回答案
    return result[0] if result else "Sorry, I don't know"

# 初始化服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口
s.bind(('192.168.0.104', 9984))
s.listen(5)
print("Waiting for connection...")

while True:
    # 接受一个新连接
    sock, addr = s.accept()
    # 创建新线程来处理TCP连接
    t = threading.Thread(target=DealClient, args=(sock, addr))
    t.start()

while True:
    # 接受一个新连接
    sock, addr = s.accept()
    # 创建新线程来处理TCP连接
    t = threading.Thread(target=DealClient, args=(sock, addr))
    t.start()

建立了一个服务器,监听端口 9984,并使用多线程的方式为每个连接的客户端提供服务。对于每个连接的客户端,服务器会接收客户端发送的消息,并使用 jieba 库对消息进行分词。然后,它会查询数据库,并返回与分词结果匹配的答案。如果未能找到匹配的答案,则返回 "Sorry, I don't know"。

首先,DealClient 函数会打印接受到的新连接的地址,然后发送一条消息 "you:" 给客户端。然后,进入一个无限循环,不断接收客户端发送的消息。如果接收到的数据为空或者收到的消息为 "exit",则跳出循环,断开与客户端的连接。

如果接收到的消息不为空且不是 "exit",则对消息进行分词,并使用 get_answer 函数查询数据库,获取答案。如果能够找到答案,则发送答案给客户端;如果未能找到答案,则发送 "Sorry, I don't know" 给客户端。

最后,DealClient 函数关闭与客户端的连接,并打印连接已关闭的消息。

在主程序中,首先使用 socket 库创建了一个服务器套接字,然后调用 bind 函数绑定了服务器的 IP 地址和端口号,最后调用 listen 函数开始监听端口。

接着,进入一个无限循环,不断接受新的连接。对于每个新的连接,使用 threading 库的 Thread 类创建一个新线程,并将 DealClient 函数作为目标函数,sock 和 addr 作为参数传递给新线程。然后启动新线程,开始为新的客户端提供服务。

此外,在主程序的末尾我还设置了一个 while True 循环,但是该循环没有任何内容,所以它将永远不会结束。这意味着服务器程序将一直运行,直到人为中断或者出现异常。

客户端

import socket

# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect(('192.168.0.104', 9984))

while True:
    # 接收服务器消息
    data = s.recv(1024)
    print(data.decode('utf-8'))
    # 发送消息给服务器
    str = input()
    s.send(str.encode('utf-8'))
    if str == 'exit':
        break
s.close()

这段代码创建了一个简单的客户端,它可以连接到在端口 9884 上运行的服务器。客户端向用户提示输入问题,并接收用户输入的问题。客户端将问题发送到服务器,然后等待服务器的答案。当服务器发送答案时,客户端将答案显示给用户。如果用户输入了 'bye',客户端将关闭连接并退出。

1.上述代码是一段简单的TCP客户端程序。

2.该程序中先建立了一个TCP套接字,并设置了主机名和端口号,然后连接到服务器。

3.之后,在一个while循环中,客户端输入一个问题,然后将其发送给服务器,服务器会回答,客户端再显示出来。

4.如果客户端输入的是“exit”,则结束循环,关闭TCP套接字。

数据库代码

import sqlite3
# 建立数据库
conn = sqlite3.connect('data.db')
c = conn.cursor()
# 建表
c.execute('CREATE TABLE qa (question text, answer text)')
# 插入数据
c.executemany('INSERT INTO qa VALUES (?,?)',[
    ('你叫什么名字?', '我叫李修基。'),
    ('你是哪个学校的?', '西北民族大学'),
    ('西北民族大学环境好吗?', '非常好'),
    ('学校在哪里?', '学校在甘肃省兰州市'),
    ('你们校有多少学生?', '现有学生约2.5万人'),
    ('学校有多少教室?', '学校有约1000间教室'),
    ('学校有多少体育馆?', '学校有3个体育馆'),
    ('学校有多少食堂?', '学校有12个食堂'),
    ('学校有多少实验室?', '学校有约100个实验室'),
    ('学校有多少住宿楼?', '学校有31个住宿楼'),
    ('学校有多少社团?', '学校有约200个社团'),
    ('学校有多少学院?', '学校有30多个学院'),
    ('学校有多少教工?', '学校有约3000多名教工'),
    ('学校有多少国际学生?', '学校有约6000多名国际学生'),
    ('学校有多少行政办公楼?', '学校有约20多个行政办公楼'),
    ('学校有多少报告厅?', '学校有约10个报告厅'),
    ('学校有多少体育场?', '学校有4个体育场'),
    ('学校有多少风景点?', '学校有约20个风景点'),
    ('学校有多少宿舍?', '学校有约5000多间宿舍'),
    ('学校有多少艺术团?', '学校有约10个艺术团'),
    ('学校有多少园林?', '学校有约20个园林'),
    ('学校有多少实验室中心?', '学校有约20个实验室中心'),
    ('学校有多少运动场?', '学校有约20个运动场'),
    ('学校有多少农场?', '学校有约10个农场'),
    ('学校有多少健身房?', '学校有约10个健身房'),
    ('学校有多少实训室?', '学校有约20个实训室'),
    ('学校有多少游泳池?', '学校有约10个游泳池'),
    ('学校有多少商店?', '学校有约50个商店'),
    ('学校有多少展览厅?', '学校有约20个展览厅'),
    ('马伟老师帅吗?', '马伟老师讲课讲的特别好,还非常帅,声音还特别好听'),
]
)
# 保存
conn.commit()
# 关闭
conn.close()

这段代码创建了一个名为 data.db 的 SQLite 数据库,并在该数据库中创建了一个名为 qa 的表。该表具有两列:question 和 answer,分别用于存储问题和答案。代码还向 qa 表中插入了三条数据,分别是关于校园百科的问题及答案。最后,代码保存更改并关闭数据库连接。

运行这段代码后,将创建一个名为 data.db 的数据库文件,并在该数据库中创建一个名为 qa 的表。该表将包含三条关于校园百科的问题和答案。

1.首先,我们使用sqlite3包连接到数据库,并创建一个游标对象。

2.接下来,我们创建一个表,表名为qa,其中包含两个字段,分别为question和answer,它们都是文本类型。

3.然后,使用executemany函数插入数据,参数为一个元祖的列表,每个元组都是一条记录。

4.最后,使用commit函数将数据提交,并使用close函数关闭连接。

实现结果:

  • 通过import sqlite3模块来建立数据库连接,把问答语句存储在数据库中。
  • 使用jieba库来进行分词

        words = list(jieba.cut(data.decode('utf-8')))

        cut 函数接受一个字符串作为输入,并返回一个生成器。生成器可以通过迭代器的方式访问分词结果,即每次调用 next 函数获取分词的下一个词。

        为了方便使用,我使用了 list 函数将分词结果转换为列表,并将结果赋值给变量 words。之后,就可以像操作列表一样操作分词结果了。

  • 结果学校食堂或者学校 食堂都得不到正确答案,因为得需要使用通配符:

        query = 'SELECT answer FROM qa WHERE question LIKE "%' + '%'.join(words) + '%"'

        输入学校%食堂,就可以得出正确回答。

  • 同样这个数据库存储的方法我也是用 threading 模块来创建和管理多线程。代码中可以使用 threading.Thread() 函数创建一个新的线程,并使用 start() 函数来启动线程。在此是由两个客户端与服务器端建立连接。

总结与体会

拿到此次作业后,在编写这样的聊天程序时,我主要考虑以下几点:

  1. 利用Python的socket模块创建TCP连接,以便接收客户端的消息。
  2. 在数据库中存储30条校园百科知识问答语句,以便快速回复客户端的问题。
  3. 使用一个算法来分析客户端发送的消息,并根据该消息查询数据库,生成回复。
  4. 不断监听客户端的消息,服务器接收请求消息,并使用 jieba 库对消息进行分词并及时回复,提供客户端友好的交互体验。

针对套接字编程,我根据课堂所讲以及查阅资料,了解到了以下几点:

一、什么是套接字编程

套接字编程是指使用网络编程技术,利用操作系统提供的套接字接口,实现客户端和服务器之间的数据通信,从而实现分布式系统的编程。它是一种利用网络的编程技术,它可以使客户端和服务器之间的通信更加简单、更加高效。

二、套接字编程的实现原理

套接字编程的实现原理是使用Socket编程接口,实现客户端和服务器之间的数据交换。Socket接口是一种特殊的网络接口,它可以提供网络应用程序访问网络的接口。Socket接口分为客户端Socket和服务器Socket。服务器Socket用来监听客户端的连接请求,客户端Socket用来发起连接请求。当客户端Socket发起连接请求后,服务器Socket就会接受连接请求,并创建一个新的Socket来和客户端通信。接下来,客户端和服务器就可以通过这个Socket来进行数据交换。

三、套接字编程的步骤

1. 创建Socket对象:客户端和服务器必须使用Socket对象来实现网络通信,因此首先必须创建Socket对象。

2. 建立连接:服务器端Socket对象必须调用bind方法,绑定一个本地地址,然后调用listen方法监听端口,客户端Socket对象调用connect方法来连接服务器端的Socket对象。

3. 发送数据:客户端Socket对象调用send方法将数据发送给服务器端;服务器端Socket对象调用recv方法接收客户端发送的数据。

4. 关闭连接:客户端和服务器端Socket对象都可以调用close方法来关闭连接。

四、套接字编程的优点

1. 可以实现不同平台之间的数据交换。由于套接字编程是使用网络编程技术,因此它可以实现不同平台之间的数据交换。

2. 可以简化网络编程。由于套接字编程可以使用Socket接口来实现客户端和服务器之间的数据交换,因此可以简化网络编程。

3. 更加高效。套接字编程可以使用Socket接口来实现客户端和服务器之间的高效数据交换,从而可以提高网络应用程序的性能。

五、套接字编程的缺点

1. 安全性较差。由于套接字编程没有经过安全性的检查,因此它的安全性较差。

2. 不支持多种协议。套接字编程只能用于TCP/IP协议,不能用于其他协议。

3. 容易出错。由于套接字编程涉及到多种技术,如果没有正确地实现,容易出现错误。

六、总结

套接字编程是一种网络编程技术,它可以使客户端和服务器之间的通信更加简单、更加高效。使用套接字编程可以实现不同平台之间的数据交换,简化网络编程,以及提高网络应用程序的性能,但是它的安全性较差,不支持多种协议,容易出错。

针对TCP连接,我根据课堂所讲以及查阅资料,了解到了以下几点:

一、TCP连接简介

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的协议,是建立在IP协议上的一种协议,是OSI(Open System Interconnection,开放系统互联)参考模型的第四层的协议,它的功能是保证一个可靠的传输,TCP建立在IP协议之上,两者组成了TCP/IP协议,TCP/IP协议是现在网络最常用的协议,是互联网的基础。

TCP连接是客户端和服务器之间建立的一种可靠的数据传输连接,它可以保证传输的数据不会丢失,并且按照正确的顺序到达目的地。TCP连接是由三个阶段组成的:建立连接,传输数据,释放连接,TCP连接由客户端发起,服务器接受,而客户端和服务器之间的双向的通信叫做TCP连接,TCP连接是一种面向连接的网络协议,是面向连接的协议,它在连接建立之后,会在两端建立一个可靠的通信通道,传输的数据可以按照正确的顺序到达目的地。

二、TCP连接建立过程

TCP连接建立是指两个端点之间的可靠的数据传输连接的建立过程,它由三个步骤组成:建立连接,传输数据,释放连接。

1、建立连接

建立TCP连接的过程,即三次握手过程:

(1)客户端发送连接请求报文段,该报文段中包含客户端确认号(Sequence Number);

(2)服务端收到客户端发来的连接请求报文段,并返回一个确认报文段,该报文段中包含客户端确认号,服务器确认号(Sequence Number);

(3)客户端收到服务端的确认报文段,并返回一个确认报文段,该报文段中包含服务器确认号,客户端确认号;

这样,客户端和服务端之间就建立了可靠的连接,此时可以进行数据传输。

2、传输数据

在建立完连接之后,客户端和服务端之间就可以进行数据传输了,客户端发送数据时,会带上相应的确认号,服务端收到客户端发来的数据后,会发送一个确认报文段,确认报文段中包含客户端确认号,服务端确认号,这样,客户端和服务端之间的双向数据传输就完成了。

3、释放连接

当客户端和服务端之间的数据传输完成后,双方就可以释放连接了,释放连接的过程是一个四次握手过程:

第一次挥手:客户端(主动关闭方)发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态。

第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_WAIT状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。

第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。

第四次挥手:客户端收到FIN后,客户端进入Time_WAIT状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。

三、TCP连接的优点

1、可靠性高:TCP是一种面向连接的协议,它保证了传输的数据不会丢失,并且按照正确的顺序到达目的地,因此,它具有很高的可靠性。

2、安全性高:TCP连接是可靠的,而且它还可以使用加密技术来保证数据的安全性,从而可以保证数据在传输过程中不被第三方攻击。

3、简单性高:TCP连接的建立和释放都是一个三次握手的过程,而且它的传输数据的机制也是相对简单的,因此,它的实现也相对简单。

4、灵活性高:TCP连接可以根据客户端和服务端之间的网络状况,动态的调整传输的速率,从而可以提高传输的效率。

四、TCP连接的缺点

1、数据传输速度慢:由于TCP连接使用了三次握手的机制,因此,数据传输速度会比较慢,这也是它的一个缺点。

2、流量控制困难:由于TCP连接使用了流量控制机制,因此,在网络状态发生变化的情况下,流量控制会变得比较困难,这也是它的一个缺点。

3、穿透性差:TCP连接使用了IP地址和端口号来确定两端的设备,因此,它不能穿透防火墙,这也是它的一个缺点。

针对jieba库分词,我根据课堂所讲以及查阅资料,了解到了以下几点:

  • jieba.cut 方法接受四个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型;use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;
  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  • 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
  • jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

Python编程实现自动聊天程序:

1、首先要编写TCP客户端和服务端,使用Python编程语言实现。客户端程序可以使用socket模块来建立TCP连接,并且使用sys模块可以实现命令行参数的解析;服务端程序可以使用socket模块来建立TCP连接,并且使用threading模块实现多线程服务器,以支持多个客户端同时访问服务器。

2、在客户端和服务端之间建立TCP连接后,客户端可以发送消息给服务端,服务器接收请求消息,并使用 jieba 库对消息进行分词,然后查找匹配的聊天机器人回复,最后将回复发送给客户端实现自动聊天。

3、为了提高聊天机器人的服务水平,可以使用机器学习的方法,构建一个深度神经网络,用于模拟人类的思维活动,来处理聊天内容,以实现更加智能化的聊天机器人。但由于本次作业时间有限,我并未去考虑这个东西,但在今后如果有空,我会去继续学习这方面的知识的。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基于TCP协议聊天程序课设需要一定的预备知识。 首先,需要了解TCP协议的基本原理。TCP(传输控制协议)是一种面向连接的协议,它提供可靠的数据传输服务。具体而言,需要理解三次握手建立连接和四次挥手断开连接的过程,以及TCP头部的结构和各字段的含义。 其次,需要掌握网络编程的基础知识。网络编程是通过网络传输数据的一种编程方式,需要了解套接字的概念和使用方法,比如如何创建和关闭套接字,如何绑定和监听端口,以及如何接收和发送数据。 此外,对于聊天程序实现,还需要熟悉多线程编程。由于聊天程序需要同时处理多个客户端的请求和消息,因此需要使用多线程来实现多任务并发处理。对于线程的创建、同步和销毁等操作,都需要有一定的了解。 还有,需要掌握基本的数据结构和算法知识。在聊天程序中,需要用到一些数据结构来存储用户信息、消息记录等相关数据。同时,还需要对发送和接收消息的算法进行设计和实现。 最后,对编程语言的掌握也是必要的。在实现聊天程序时,可以选择任意一种你熟悉的编程语言,比如Java、Python等。掌握这些语言的基本语法和相关的网络编程库,能够更好地实现基于TCP协议聊天程序。 综上所述,基于TCP协议聊天程序课设需要对TCP协议、网络编程、多线程编程、数据结构和算法、以及编程语言等方面有一定的预备知识。 ### 回答2: 基于TCP协议聊天程序是一种实现在网络上进行即时通讯的应用程序。在准备做这个课设之前,需要掌握一些相关的预备知识。 首先,了解TCP协议是非常重要的。TCP(传输控制协议)是一种面向连接的协议,它确保数据的可靠传输。学习TCP协议的工作流程,掌握TCP连接的建立、数据传输和连接的断开等基本过程是必不可少的。 其次,需要学习Socket编程。Socket是一种在计算机网络之间进行通信的机制。理解如何创建和使用Socket,包括基本的Socket API函数的使用,如bind、listen、accept、connect、send和receive等,是实现基于TCP聊天程序的关键。 此外,了解网络编程中的并发和多线程编程也是必要的。因为聊天程序需要同时处理多个客户端的连接和消息传输,所以需要掌握并发编程的相关知识,以实现多个连接的管理和消息的及时处理。 最后,在开始实现聊天程序之前,建议先进行需求分析和设计。明确聊天程序的功能和架构,包括如何处理客户端的连接请求,如何进行消息的传输和接收,如何实现聊天室的功能等。并根据需求进行设计,编写程序时可以遵循模块化的原则,实现可重用和可扩展的代码。 总之,基于TCP协议聊天程序课设需要掌握TCP协议的基本知识,了解Socket编程、并发编程和网络通信的相关概念和技术,并进行需求分析和设计,才能实现一个功能完善且稳定的聊天程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值