diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..f1b9c78
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,12 @@
+
+
因为其他网站base64解码都一坨屎,解码格式一直有问题,无法进行正常解码,要不然就是解码之后中文乱码了,所以写了这个demo
+接口地址:http(s)://网站域名/decode | http(s)://网站域名/encode
+恭喜你,来到了一片荒芜之地
+ + + \ No newline at end of file diff --git a/99demo/content-to-tag/extract_doc_tag.py b/99demo/content-to-tag/extract_doc_tag.py new file mode 100644 index 0000000..5d04042 --- /dev/null +++ b/99demo/content-to-tag/extract_doc_tag.py @@ -0,0 +1,139 @@ +import requests +import json +import re +import time # 导入 time 模块 + +# OLLAMA_BASE_URL = "http://127.0.0.1:11434/api/generate" +# OLLAMA_BASE_URL = "http://152.136.153.72:27009/api/generate" +def extract_tags_with_ollama_from_content(ollama_base_url,model, article_content, max_tags=10, min_length=2, max_length=6): + """ + 使用本地 Ollama 大语言模型分析文章内容并提取关键词。 + + Args: + article_content (str): 输入的文章内容字符串。 + max_tags (int): 希望返回的最大标签数量。 + min_length (int): 关键词最小长度。 + max_length (int): 关键词最大长度。 + + Returns: + list: 提取到的关键词/标签列表。 + """ + if not article_content or not article_content.strip(): + return { + 'code': 0, + 'message': 'success', + 'data': { + 'model': model, + 'think': '警告:输入的文章内容为空或仅包含空白字符。', + 'tags': [], + 'consume': 0.0 + } + } + + # 2. 构建 Prompt + # 使用中文提示,更符合 qwen 模型的特点 + prompt = f""" +请严格按照以下要求,从提供的文章内容中提取关键词。 + +文章内容: +{article_content} + +要求: +- 提取最多 {max_tags} 个最能概括文章主旨和核心概念的关键词。 +- 关键词必须来源于文章内容,准确反映文章主题。 +- 每个关键词的长度必须在 {min_length} 到 {max_length} 个字符之间。 +- 输出格式为:关键词1, 关键词2, 关键词3, ... +- 只输出关键词列表,不要有任何其他解释或前缀。 + +""" + # 记录开始时间 + start_time = time.time() + # 3. 准备发送给 Ollama API 的 payload + payload = { + "model": model, + "prompt": prompt, + "system": "你是一个专门生成文章标签的助手,请你根据我给你的文章的内容总结并生成一系列的标签,格式可以参考[关键词1, 关键词2, 关键词3].你只需要给我生成这种形式的标签即可,其他分析内容无需输出.", + "stream": False, + "options": { + "top_p": 0.9, + "temperature": 0.1, # 较低的温度使输出更确定、更聚焦 + "num_predict": 64000, # 控制预测的最大 token 数 + } + } + + try: + # 4. 发送 POST 请求到 Ollama API + response = requests.post(ollama_base_url, json=payload) + # 5. 检查响应状态 + if response.status_code != 200: + # print(f"Error: Ollama API returned status code {response.status_code}") + print(response.text) + return { + 'code': 404, + 'message': f"{response['error']}", + } + # 6. 解析 JSON 响应 + result = response.json() + if "response" not in result: + print(result) + return { + 'code': 500, + 'message': "Error: Unexpected response format from Ollama", + } + + llm_output = result["response"].strip() + # print(llm_output) + think_match = re.search(r'支持 X 和 Bilibili
+ +下载完成后在此预览视频
+=a)}}for(var h=this.__startIndex;h n?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c) t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function kM(t){return"center"===t.position}function LM(t){var e,n,i=t.getData(),r=[],o=!1,a=(t.get("minShowLabelAngle")||0)*CM,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function d(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),f=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),x=y.get("alignTo"),_=$r(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=$r(S,u);var M=w.get("length2");if(M=$r(M,u),Math.abs(c.endAngle-c.startAngle)0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(j(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G){F=k<0?-A+B:-A}else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var X=(p.style.margin||0)+2.1;Y.y-=X/2,Y.height+=X,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new De(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p