如何利用Python实现分词和NER的Web服务

        大家都知道python在数据处理、数据分析和机器学习等方面的强大之处,那么如何使用Python实现Web方式的HTTP应用和服务呢,其实有很多种方式,比如利用gradio、streamlit实现web应用,利用FastApi实现web服务等等,具体详见之前的大模型应用文章,本文采用tornado框架实现http web服务,并结合自然语言处理(NLP)的分词和实体识别的需求,分别实现如何提供相应的http服务。具体如下:
运行环境:python3.10,tornado,jieba,time,logging等
运行命令:python httpServer_nlp.py
调用方法:http://localhost:8082/cutsegment?content=油气勘探开发文档的语义分析及提取方法的研究与实现三个方面研究&search_type=1
识别结果(分词):{"cut": ["油气勘探", "开发", "文档", "语义", "分析", "提取", "方法", "研究", "三个", "研究"], "entities": [], "returncode": 0, "message": "ok", "runtime": 0.3878319263458252}
识别结果(实体):{"cut": [], "entities": ["方法", "语义", "分析", "提取", "实现", "文档", "方面"], "returncode": 0, "message": "ok", "runtime": 0.4005763530731201}

import sys  
import os  
import time  
import tornado.httpserver  
from tornado.options import define, options  
import json  
from collections import OrderedDict  
import re  
import jieba  
from jieba import analyse  
import logging  
# 设置日志记录  
logger = logging.getLogger()  # 获取日志记录器  
logger.setLevel(logging.INFO)  # 设置全局日志输出级别  
# 创建文件日志记录处理器,并指定一些设置选项  
fileHandler = logging.FileHandler(filename=f'./log/service.log', mode='a+', encoding='utf-8', delay=False)  
# 定义日志输出风格(格式器)  
format_option = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(threadName)s - %(levelname)s: %(message)s'  
fileHandler.setFormatter(logging.Formatter(format_option))  
# 将日志记录处理器加入日志对象  
logger.addHandler(fileHandler)  
# logger.info("result:{}".format(output))  # 本地日志记录示例  # 设置端口  
define("port", default=8082, help="--port", type=int)  
# 获取分词结果  
def get_kg_result_0(text):  jieba.load_userdict("./data/StopWord/user_dict.txt")  # 加载自定义分词词典  # 2 获取停用词  stwlist = get_stop_words()  text,theDate=get_date(text)  # 3 分词并去除停用词  out_dict = remove_special_tokens(jieba.cut(text, cut_all=False), stwlist)  print('\n\n1.加载自定义分词词典:\n' + "/ ".join(out_dict))  return out_dict+theDate    
# 利用TF-IDF获取实体  
def get_entity_0(text):  # 抽取前多少的关键词,并按照权重值由高到低返回  print('抽取前多少的关键词' + '//')  textrank = analyse.textrank  keywords2 = textrank(text)  print(keywords2)  return keywords2    
# 读取停用词  
def get_stop_words(path=r'./data/StopWord/NLPIR_stopwords.txt'):  file = open(path, 'r',encoding='utf-8').read().split('\n')  return set(file)    
# 去掉一些停用词/单字符/空字符等  
def remove_special_tokens(words, stwlist):  words_list = list(words)  stop_words = stwlist  for i in range(words_list.__len__())[::-1]:  if words_list[i] in stop_words: # 去除停用词  words_list.pop(i)  elif (len(words_list[i]) == 1):  # 去除单个字符  words_list.pop(i)  elif words_list[i] == " ":  # 去除空字符  words_list.pop(i)  return words_list  # 整体获取日期,日期需要在分词之前做单独处理  
def get_date(content):  pattern = r'\d{4}-\d{1,2}-\d{1,2}|\d{4}年\d{1,2}月\d{1,2}日|\d{4}/\d{1,2}/\d{1,2}'  result = re.findall(pattern, content)  for item in result:  content = content.replace(item, "灥")  # 将日期转换为特殊字符,一般采取不常用的汉字代替  return content,result    
# tornado结构,只需要在里面添加代码,规范输出格式即可  
class MainGetHandler(tornado.web.RequestHandler):    def recog(self, mode="get"):  """ 能够同时支持get和post请求 """        if mode == "get":  sub = self.get_argument("content", None)  search_type = self.get_argument("search_type", 0)  search_type = int(search_type)  uid = self.get_argument("uuid", "000000")  else:  """ post方式接收data传递来的参数 """            data = json.loads(self.request.body.decode())  sub = data["content"] if "content" in data else None  search_type = int(data["search_type"]) if "search_type" in data else 0  uid = data["uuid"] if "uuid" in data else "000000"  #### 配置参数 ####        result = OrderedDict()  returncode = 0  message = "ok"  output = {}  entity={}  start = time.time()  if search_type == 0 or search_type > 4:  returncode = 10000  message = "search_type is error"  if sub is None and rel is None and obj is None:  returncode = 10001  message = "data is null"  if search_type == 1: # 查content的全部relation和object,content不能为空  try:  if sub == None or sub in [""," "]:  returncode = 10002  message = "when search_type is 1, content not null"  else:  output = get_kg_result_0(sub)  entity=[]  except Exception as e:  logger.info("{},error: {}".format(output))  returncode = 10002  message = "service error"  elif search_type == 2:  try:  if sub == None or sub in [""," "]:  returncode = 10003  message = "when search_type is 2, content and rel not null"  else:  output = []  entity=get_entity_0(sub)  except Exception as e:  logger.info("{},error: {}".format(entity))  returncode = 10003  message = "service error"    end = time.time()  detal = end - start    # 以json格式输出,参考输出格式  result["cut"] = output  result["entities"]=entity #实体识别  result["returncode"] = returncode  result["message"] = message  result["runtime"] = detal    logger.info("result:{}".format(result))        # 本地日志  self.write(json.dumps(result, ensure_ascii=False))  # 写结果  self.finish()    def get(self):  """ get方式调用 """        self.recog(mode="get")    def post(self):  """ post方式调用 """        self.recog(mode="post")  
# 主程序  
if __name__ == "__main__":  # """ 服务器启动 """    print("Server is listening,Port:" + str(options.port) + " ...")  sys.path.append("../")  # 将当前目录加载道path中  tornado.options.parse_command_line()  # 域名规则,需要与nginx中配置的一致  application = tornado.web.Application([(r"/cutsegment", MainGetHandler)])  http_server = tornado.httpserver.HTTPServer(application)  http_server.listen(options.port)  tornado.ioloop.IOLoop.instance().start()  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯 第十四届省赛Java B组】真题训练(A - C)正在更新

目录 A、阶乘求和 - BigInteger B、幸运数字 - 字符串 进制转换 暴力大法 C、数组分割 - A、阶乘求和 - BigInteger 思路: 当时比赛时,拿计算器算的,然后辛辛苦苦也没对 看到这个数肯定很大,而且只求后9位,阶乘越…

【计算机网络】应用层

应用层协议原理 客户-服务器体系结构: 特点:客户之间不能直接通信;服务器具有周知的,固定的地址,该地址称为IP地址。 配备大量主机的数据中心常被用于创建强大的虚拟服务器;P2P体系结构: 特点&…

K8S知识点(二)

(1)K8S概念 K8S是通过控制pod来控制容器进而控制程序的 service是沟通Pod和外键的桥梁,可以实现负载均衡的效果,加权负载的效果 (2)环境搭建-环境规划 (3)环境搭建-主机安装 使用…

求先序排列

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度 ≤ 8)。 输入描述: 2行,均为大写字母组…

MTR (Mini-Transaction)

MTR,即Mini-Transaction,是InnoDB存储引擎中的一种管理并发事务的机制。它用于确保在并发环境下,数据库操作的一致性、隔离性和持久性。MTR被设计用来管理数据库内部的操作,以确保多个事务在并发执行时,对数据的修改不…

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现PSO-VMD粒子群算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PSO-VMD粒子群算法PSO优化VMD变分模态分解 可直接运行 分解效果…

2023-11-04 LeetCode每日一题(数组中两个数的最大异或值)

2023-11-04每日一题 一、题目编号 421. 数组中两个数的最大异或值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 1&#xff1a; 示例 2&…

[动态规划] (六) 路径问题 LeetCode 63.不同路径II

[动态规划] (六) 路径问题: LeetCode 63.不同路径II 文章目录 [动态规划] (六) 路径问题: LeetCode 63.不同路径II题目解析解题思路状态表示状态转移方程初始化和填表返回值 代码实现总结 63. 不同路径 II 题目解析 (1) 机器人从左上角移动到右下角 (2) 机器人只能向右或者向…

Android STR研究之四

前言&#xff1a; 在前三篇中初步介绍了开机流程和STR流程&#xff0c;这里讲唤醒 Android STR研究之一-CSDN博客 Android STR研究之二-CSDN博客 Android STR研究之三-CSDN博客 唤醒 如上文所述&#xff0c;当唤醒的时候代码会继续往下执行 private void doHandleDeepSleep(bo…

【漏洞复现】Nginx_0.7.65_空字节漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.1、漏洞描述 1.2、漏洞等级 1.3、影响版本 0.7.65 1.4、漏洞复现 1、基础环…

JavaScript数据类型检测与数据类型转换详细解析与代码实例

JavaScript是一种弱类型语言&#xff0c;因此在开发过程中&#xff0c;经常需要进行数据类型检测和数据类型转换。本文将详细介绍JavaScript中的数据类型检测和转换&#xff0c;并提供相关的代码实例。 一、数据类型检测 在JavaScript中&#xff0c;常用的数据类型有&#xf…

JavaSpringbootMySQL高校实训管理平台01557-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 高校实训管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系…

Oracle安全基线检查

一、账户安全 1、禁止SYSDBA用户远程连接 用户具备数据库超级管理员(SYSDBA)权限的用户远程管理登录SYSDBA用户只能本地登录,不能远程。REMOTE_LOGIN_PASSWORDFILE函数的Value值为NONE。这意味着禁止共享口令文件,只能通过操作系统认证登录Oracle数据库。 1)检查REMOTE…

vue+prismjs 网页代码高亮插件

最近在使用wangEditor的过程中发现编辑器中代码块展示没有问题&#xff0c;但是预览编辑器中的内容样式丢失&#xff0c;看过wangEditor的文档后发现用到了Prism.js&#xff0c;现将使用的经验分享。 使用步骤 1、安装prismjs插件 // 1. 安装prismjs 插件 npm install prismj…

软考高项-项目资源管理过程

规划资源管理&#xff1a;定义如何估算、获取、管理和利用实物以及团队项目资源&#xff1b;估算活动资源&#xff1a;估算执行项目所需的团队资源&#xff0c;材料、设备和用品的类型和数量&#xff1b;获取资源&#xff1a;获取项目所需的团队成员、设施、设备、材料、用品和…

【python 深拷贝与浅拷贝】

python 深拷贝与浅拷贝 问题&#xff1a; 在用影刀编写流程的时候发现&#xff0c;明明只修改人名为“小张”对应的字典里面的值&#xff0c;但是所有的人名对应的值都被修改了。 原因&#xff1a; 第14行&#xff0c;设置键值对&#xff0c;值对应的变量“初始打卡类型字…

伪随机序列——m序列及MATLAB仿真

文章目录 前言一、m 序列1、m 序列的产生2、m 序列的性质①、均衡性②、游程分布③、移位相加特性④、自相关函数⑤、功率谱密度⑥、伪噪声特性 二、M 序列1、m 序列的产生2、m 序列的性质 三、MATLAB 中 m 序列1、m 序列生成函数的 MATLAB 代码2、MATLAB 仿真 前言 在通信系统…

CVE-2023-34040 Kafka 反序列化RCE

漏洞描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块&#xff0c;用于简化在 Spring 应用程序中集成 Apache Kafka 的过程&#xff0c;记录 (record) 指 Kafka 消息中的一条记录。 受影响版本中默认未对记录配置 ErrorHandlingDeserializer&#xff0c;当用户将容…

二叉树第i层结点个数

//二叉树第i层结点个数 int LevelNodeCount(BiTree T, int i) {if (T NULL || i < 1)return 0;if (i 1) return 1;return LevelNodeCount(T->lchild, i - 1) LevelNodeCount(T->rchild, i - 1); } int GetDepthOfBiTree(BiTree T) {if (T NULL)return 0;return Ge…