#!/usr/bin/python3
# -*- coding:utf-8 -*-
# Author: zsj
# @Time: 2021/6/15 11:34
import json
import jieba.analyse
import traceback
# from lexical_analysis.predict_paddle import predict_lexical
from flask import request, jsonify
from flask import Flask
from jieba.analyse.tfidf import TFIDF
from extractTags import tf_idf
from common.common import logger
import paddle
app = Flask(__name__)
import paddle
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--device', default="cpu",
help="Select which device to train model, defaults to cpu.")
args = parser.parse_args()
paddle.set_device(args.device)
# jieba.analyse.set_stop_words('corpus/stopwords.txt')
def get_theme_words(doc, topk):
allowPOS = ('名词', '地点', '人名', '地名', '机构团体')
result = []
keywords = tf_idf(doc,allowPOS=allowPOS,topk=topk)
count = 0
logger.info(keywords)
for i in range(len(keywords)):
count +=1
word_dict = {f"keyword_{count}":keywords[i][0]}
result.append(word_dict)
return result
# 是否为空
def isempty(word):
if word.strip()=='':
return True
else:
return False
# 是否不是中文
def isnoChinese(word):
list0 = []
for ch in word:
if '\u4e00' <= ch <= '\u9fff':
list0.append(True)
else:
list0.append(False)
if list0.count(False)/len(list0)>0.7:
return True
else:
return False
#是否无标点
def isnobiaodian(word):
str0 = '!?。,;:'
list0 = []
for x in list(str0):
if x not in word:
list0.append(True)
else:
list0.append(False)
if False not in list0 and len(word) >= 200:
return True
else:
return False
# def class_metric(labels_list, pred1_list, id_to_tag):
# n_label = len(id_to_tag)
# result = np.zeros((n_label, n_label))
# for i, j in zip(pred1_list, labels_list):
# result[i, j] += 1
# results = collections.OrderedDict()
# for i in range(n_label):
# TP = result[i, i]
# FP = sum(result[i].tolist()) - TP
# FN = sum(result[:, i].tolist()) - TP
# percision = TP / (1e-5 + TP + FP)
# recall = TP / (1e-5 + TP + FN)
# f1 = 2 * percision * recall / (1e-5 + percision + recall)
# results[id_to_tag[i]] = [percision, recall, f1]
# class_list = []
# for i in results.items():
# class_ = i[0]
# percision_ = i[1][0] * 100
# recall_ = i[1][1] * 100
# f1_score = i[1][2] * 100
# if class_[0] == 'B':
# logger.info(
# "label:{},pre:{:.2f},rec:{:.2f},f1_score:{:.2f}".format(class_[2:], percision_, recall_, f1_score))
# class_prf = {"label": class_[2:], "p": '%.2f' % percision_, "r": "%.2f" % recall_, "f": "%.2f" % f1_score}
# class_list.append(class_prf)
# return results, class_list
# def predict(model, data, tokenizer, label_map, batch_size=1):
# examples = []
# for text in data:
# input_ids, token_type_ids = convert_example(
# text,
# tokenizer,
# max_seq_length=max_seq_length,
# is_test=True)
# examples.append((input_ids, token_type_ids))
#
# # Seperates data into some batches.
# batches = [
# examples[idx:idx + batch_size]
# for idx in range(0, len(examples), batch_size)
# ]
# batchify_fn = lambda samples, fn=Tuple(
# Pad(axis=0, pad_val=tokenizer.pad_token_id), # input
# Pad(axis=0, pad_val=tokenizer.pad_token_type_id), # segment
# ): fn(samples)
#
# results = []
# model.eval()
# for batch in batches:
# input_ids, token_type_ids = batchify_fn(batch)
# input_ids = paddle.to_tensor(input_ids)
# token_type_ids = paddle.to_tensor(token_type_ids)
# logits = model(input_ids, token_type_ids)
# probs = F.softmax(logits, axis=1)
# idx = paddle.argmax(probs, axis=1).numpy()
# idx = idx.tolist()
# labels = [label_map[i] for i in idx]
# results.extend(labels)
# return results
# 获取主题词结果
@app.route("/theme2", methods=["GET", "POST"])
def extract_theme_words():
return_result = {"errCode": 200, "msg": "success", "data": None}
try:
data_content = json.loads(request.get_data(), encoding="utf-8")
text = data_content["text"]
number = data_content.get("number", 5)
if isnobiaodian(text) or isnoChinese(text) or isempty(text):
return_result["errCode"] = 400
return_result["message"] = '请输入正确内容'
else:
logger.info("输入的文本是:{0}".format(text))
logger.info("返回的主题词个数是:{0}".format(number))
res = get_theme_words(text, number)
logger.info("result: %s" % json.dumps(res, ensure_ascii=False, indent=2))
if number==0 or text.replace(' ','')=='':
return_result["data"]=[]
else:
return_result["data"] = res
except Exception:
logger.error(traceback.format_exc())
return_result["errCode"] = 400
return_result["message"] = '请输入正确内容'
return json.dumps(return_result, ensure_ascii=False, indent=2)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=25005, debug=True)
没有合适的资源?快使用搜索试试~ 我知道了~
对文章中的关键词抽取textrank算法进行了性能和准确率优化
共15个文件
py:11个
sh:3个
conf:1个
需积分: 37 2 下载量 34 浏览量
2022-09-21
16:18:01
上传
评论 1
收藏 11KB ZIP 举报
温馨提示
自动摘要,就是从文章中自动抽取关键句。人类对关键句的理解通常是能够概括文章中心的句子,而机器只能模拟人类的理解,即拟定一个权重的评分标准,给每个句子打分,之后给出排名靠前的几个句子。基于 TextRank 的自动文摘属于自动摘录,通过选取文本中重要度较高的句子形成文摘。 我们是要抽取关键句,因而是以句子为基本单位。使用 TextRank 提取摘要的整个过程如下: 预处理:将文本分割成句子 S1,S2,⋯,SmS1,S2,⋯,Sm,以句子为节点构建图。 计算句子相似度:对句子进行分词、取停用词等处理,以便于计算任意两个句子之间的相似度。将计算好的句子相似度作为两个句子构成的边的权值。 句子权重:根据公式,迭代传播权重计算各句子的得分。 抽取文摘句:得到的句子得分进行倒序排序,抽取重要度最高的 N 个句子作为候选文摘句。 形成文摘:根据字数或句子数要求,从候选文摘句中抽取句子组成文摘。
资源详情
资源评论
资源推荐
收起资源包目录
关键词抽取.zip (15个子文件)
关键词抽取
config
global_config.py 229B
logging.conf 597B
__init__.py 85B
extractTags.py 3KB
run.py 5KB
strong.py 2KB
common
common.py 220B
__init__.py 129B
case.sh 684B
strong.sh 152B
lexical_analysis
predict.py 2KB
predict_paddle.py 2KB
run.py 2KB
__init__.py 0B
run.sh 60B
共 15 条
- 1
qq_38349344
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0