diff --git a/doc/ai.md b/doc/ai.md new file mode 100644 index 0000000000000000000000000000000000000000..9506292ce85409a88a81baa871c77b56589cc353 --- /dev/null +++ b/doc/ai.md @@ -0,0 +1,58 @@ +"图像处理", +"计算机视觉", +"自然语言处理", +"语音识别", +"机器翻译", +"机器学习", +"神经网络", +"深度学习", +"迁移学习", +"强化学习", +"集成学习", +"联邦学习", +"人机对话", +"知识图谱", +"图计算", +"情感分析", +"目标检测", +"目标跟踪", +"生成对抗网络", +"协同过滤", +"语言模型", +"智能推荐", +"tensorflow", +"pytorch", +"oneflow", +"opencv", +"keras", +"caffe", +"sklearn", +"mxnet", +"mlnet", +"mllib", +"paddlepaddle", +"jittor", +"deeplearning4j", +"mindspore", +"cnn", +"rnn", +"lstm", +"gru", +"dnn", +"mnn", +"alexnet", +"googlenet", +"deepfm", +"boosting", +"tensorrt", +"yolo", +"elmo", +"transformer", +"word2vec", +"doc2vec", +"glove", +"xlnet", +"bert", +"nnlm", +"lda主题模型", +"deepdive", diff --git a/src/dataset/infoq.tag.json b/src/dataset/infoq.tag.json new file mode 100644 index 0000000000000000000000000000000000000000..c44dc44f37c7b9b807ef282b291b36cda0f0bbeb --- /dev/null +++ b/src/dataset/infoq.tag.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/src/tag_source/infoq.py b/src/tag_source/infoq.py index d63200851d81e3429da711533068e79757f6440e..12e641e111cae503590c374e754b1d5a5e9e8a12 100644 --- a/src/tag_source/infoq.py +++ b/src/tag_source/infoq.py @@ -11,42 +11,63 @@ from scrapy.settings import Settings class InfoQSpider(scrapy.Spider): name = "infoq_tags" allowed_domains = ["infoq.cn"] - start_urls = ['https://www.infoq.cn/topics'] + start_urls = ['https://www.infoq.cn/public/v1/topic/getList'] custom_settings = { 'ITEM_PIPELINES':{'tag_source.infoq.TagPipeline': 301}, - 'LOG_LEVEL': 'INFO' + 'LOG_LEVEL': 'INFO', + 'COOKIES_ENABLED': True, + } def __init__(self): self.page_count = 0 self.totgal_pages = 654 + def start_requests(self): + # 浏览器用户代理 + headers = { + 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.41' + } + # 指定cookies + cookies = { + 'LF_ID': '1596546004203-7769949-7289805', + 'GRID': '8ed2875-174b7fd-6ad9862-31c4b7f', + 'SERVERID': '3431a294a18c59fc8f5805662e2bd51e|1619058525|1619058010' + } + urls = [ + 'https://www.infoq.cn/public/v1/topic/getList' + ] + for url in urls: + yield scrapy.Request(url=url, headers=headers, cookies=cookies, callback=self.parse) + def parse(self, response): self.page_count += 1 - print(response.body) - tags = response.css('.navigation-list') - print(tags) - for tag in tags: - name = tag.xpath('h2/a/text()').get() - desc = tag.xpath('p/text()').get() - star = tag.xpath('div/strong/text()').get() + with open('test.html', 'w') as f: + f.write(response.text) + + # tags = response.css('li>div>.title') + # print(tags) + # for tag in tags: + # name = tag.xpath('h2/a/text()').get() + # desc = tag.xpath('p/text()').get() + # star = tag.xpath('div/strong/text()').get() - yield { - 'name': name, - 'desc': desc, - 'star': star - } + # yield { + # 'name': name, + # 'desc': desc, + # 'star': star + # } - next_page_list = response.css('.next') - if len(next_page_list)>0: - next_page_item = next_page_list[len(next_page_list)-1] - next_page = next_page_item.css('a::attr(href)').get() - print('next_page:', next_page) - yield response.follow(next_page, callback=self.parse, dont_filter=True) + # next_page_list = response.css('.next') + # if len(next_page_list)>0: + # next_page_item = next_page_list[len(next_page_list)-1] + # next_page = next_page_item.css('a::attr(href)').get() + # print('next_page:', next_page) + # yield response.follow(next_page, callback=self.parse, dont_filter=True) class TagPipeline(object): def open_spider(self, spider): - self.file = open('dataset/segmentfault.tag.json', 'w') + self.file = open('dataset/infoq.tag.json', 'w') self.file.write('[\n') self.count = 0 self.tags = {} diff --git a/versions/category_tag_v_1.0.json b/versions/category_tag_v_1.0.json new file mode 100644 index 0000000000000000000000000000000000000000..be7e3eb49e562abf1d7499991f9d1ee059e692de --- /dev/null +++ b/versions/category_tag_v_1.0.json @@ -0,0 +1,1286 @@ +[ + { + "category_id": "12", + "category_name": "编程语言", + "tags": [ + { + "tag_id": 95, + "tag_name": "c语言" + }, + { + "tag_id": 83, + "tag_name": "c++" + }, + { + "tag_id": 288, + "tag_name": "c#" + }, + { + "tag_id": 2886, + "tag_name": "perl" + }, + { + "tag_id": 13, + "tag_name": "java" + }, + { + "tag_id": 83797, + "tag_name": "erlang" + }, + { + "tag_id": 133891, + "tag_name": "golang" + }, + { + "tag_id": 190, + "tag_name": "javascript" + }, + { + "tag_id": 87460, + "tag_name": "objective-c" + }, + { + "tag_id": 109316, + "tag_name": "kotlin" + }, + { + "tag_id": 72537, + "tag_name": "swift" + }, + { + "tag_id": 515, + "tag_name": "qt" + }, + { + "tag_id": 2135, + "tag_name": "lua" + }, + { + "tag_id": 300, + "tag_name": "ruby" + }, + { + "tag_id": 74791, + "tag_name": "bash" + }, + { + "tag_id": 75630, + "tag_name": "batch" + }, + { + "tag_id": 88232, + "tag_name": "julia" + }, + { + "tag_id": 6880, + "tag_name": "r语言" + }, + { + "tag_id": 73819, + "tag_name": "scala" + }, + { + "tag_id": 82780, + "tag_name": "typescript" + }, + { + "tag_id": 45, + "tag_name": "php" + }, + { + "tag_id": 8, + "tag_name": "python" + }, + { + "tag_id": 200024, + "tag_name": "rust" + }, + { + "tag_id": 76116, + "tag_name": "lisp" + } + ] + }, + { + "category_id": 1002, + "category_name": "游戏", + "tags": [ + { + "tag_id": 75014, + "tag_name": "游戏引擎" + }, + { + "tag_id": 200027, + "tag_name": "虚幻" + }, + { + "tag_id": 102175, + "tag_name": "ue4" + }, + { + "tag_id": 200029, + "tag_name": "ue5" + }, + { + "tag_id": 4865, + "tag_name": "unity" + }, + { + "tag_id": 200031, + "tag_name": "godot" + }, + { + "tag_id": 172, + "tag_name": "cocos2d" + }, + { + "tag_id": 200033, + "tag_name": "cryengine" + }, + { + "tag_id": 200034, + "tag_name": "lumberyard" + }, + { + "tag_id": 2509, + "tag_name": "ogre" + }, + { + "tag_id": 7985, + "tag_name": "pygame" + }, + { + "tag_id": 97567, + "tag_name": "vr" + }, + { + "tag_id": 76404, + "tag_name": "ar" + }, + { + "tag_id": 200039, + "tag_name": "mr" + }, + { + "tag_id": 200040, + "tag_name": "xr" + }, + { + "tag_id": 132043, + "tag_name": "图形渲染" + }, + { + "tag_id": 106926, + "tag_name": "着色器" + }, + { + "tag_id": 78382, + "tag_name": "maya" + }, + { + "tag_id": 76719, + "tag_name": "3dsmax" + }, + { + "tag_id": 131830, + "tag_name": "blender" + }, + { + "tag_id": 200046, + "tag_name": "cinema4d" + }, + { + "tag_id": 200047, + "tag_name": "zbrush" + }, + { + "tag_id": 200048, + "tag_name": "3dcoat" + }, + { + "tag_id": 200049, + "tag_name": "topogun" + }, + { + "tag_id": 200050, + "tag_name": "rizomuv" + }, + { + "tag_id": 200051, + "tag_name": "substance designer" + }, + { + "tag_id": 200052, + "tag_name": "substance painter" + }, + { + "tag_id": 200053, + "tag_name": "quixel" + }, + { + "tag_id": 105876, + "tag_name": "houdini" + }, + { + "tag_id": 200055, + "tag_name": "数字雕刻" + }, + { + "tag_id": 200056, + "tag_name": "重拓扑" + }, + { + "tag_id": 92009, + "tag_name": "uv" + }, + { + "tag_id": 200058, + "tag_name": "骨骼绑定" + }, + { + "tag_id": 131803, + "tag_name": "材质" + }, + { + "tag_id": 86384, + "tag_name": "贴图" + }, + { + "tag_id": 208, + "tag_name": "动画" + }, + { + "tag_id": 200062, + "tag_name": "关卡设计" + }, + { + "tag_id": 200063, + "tag_name": "游戏程序" + }, + { + "tag_id": 200064, + "tag_name": "游戏美术" + }, + { + "tag_id": 200065, + "tag_name": "游戏策划" + }, + { + "tag_id": 131818, + "tag_name": "技术美术" + }, + { + "tag_id": 200067, + "tag_name": "cascadeur" + }, + { + "tag_id": 131924, + "tag_name": "spine" + } + ] + }, + { + "category_id": "11", + "category_name": "前端", + "tags": [ + { + "tag_id": 190, + "tag_name": "javascript" + }, + { + "tag_id": 82780, + "tag_name": "typescript" + }, + { + "tag_id": 87999, + "tag_name": "node.js" + }, + { + "tag_id": 104887, + "tag_name": "layui" + }, + { + "tag_id": 317, + "tag_name": "jquery" + }, + { + "tag_id": 7658, + "tag_name": "bootstrap" + }, + { + "tag_id": 104836, + "tag_name": "angular.js" + }, + { + "tag_id": 4662, + "tag_name": "easyui" + }, + { + "tag_id": 110463, + "tag_name": "elementui" + }, + { + "tag_id": 90670, + "tag_name": "vue.js" + }, + { + "tag_id": 105656, + "tag_name": "react.js" + }, + { + "tag_id": 80378, + "tag_name": "echarts" + }, + { + "tag_id": 97466, + "tag_name": "electron" + } + ] + }, + { + "category_id": "20", + "category_name": "大数据", + "tags": [ + { + "tag_id": 104561, + "tag_name": "big data" + }, + { + "tag_id": 168, + "tag_name": "database" + }, + { + "tag_id": 411, + "tag_name": "mysql" + }, + { + "tag_id": 94, + "tag_name": "oracle" + }, + { + "tag_id": 5453, + "tag_name": "mongodb" + }, + { + "tag_id": 133782, + "tag_name": "postgresql" + }, + { + "tag_id": 5044, + "tag_name": "redis" + }, + { + "tag_id": 79026, + "tag_name": "memcache" + }, + { + "tag_id": 71, + "tag_name": "sqlite" + }, + { + "tag_id": 8946, + "tag_name": "spark" + }, + { + "tag_id": 75246, + "tag_name": "kafka" + }, + { + "tag_id": 8767, + "tag_name": "zookeeper" + }, + { + "tag_id": 107876, + "tag_name": "eureka" + }, + { + "tag_id": 124330, + "tag_name": "etcd" + }, + { + "tag_id": 130944, + "tag_name": "consul" + }, + { + "tag_id": 72615, + "tag_name": "rabbitmq" + }, + { + "tag_id": 11350, + "tag_name": "flume" + }, + { + "tag_id": 11351, + "tag_name": "elasticsearch" + }, + { + "tag_id": 3256, + "tag_name": "hadoop" + }, + { + "tag_id": 2807, + "tag_name": "hbase" + }, + { + "tag_id": 4633, + "tag_name": "hive" + }, + { + "tag_id": 126431, + "tag_name": "flink" + }, + { + "tag_id": 5988, + "tag_name": "storm" + }, + { + "tag_id": 200106, + "tag_name": "时序数据库" + }, + { + "tag_id": 200107, + "tag_name": "tdengine" + } + ] + }, + { + "category_id": 1005, + "category_name": "数据结构与算法", + "tags": [ + { + "tag_id": 970, + "tag_name": "数据结构" + }, + { + "tag_id": 68, + "tag_name": "算法" + }, + { + "tag_id": 4861, + "tag_name": "链表" + }, + { + "tag_id": 99646, + "tag_name": "散列表" + }, + { + "tag_id": 200112, + "tag_name": "宽度优先" + }, + { + "tag_id": 200113, + "tag_name": "广度优先" + }, + { + "tag_id": 200114, + "tag_name": "深度优先" + }, + { + "tag_id": 200115, + "tag_name": "迭代加深" + }, + { + "tag_id": 127386, + "tag_name": "启发式算法" + }, + { + "tag_id": 200117, + "tag_name": "图搜索算法" + }, + { + "tag_id": 10398, + "tag_name": "动态规划" + }, + { + "tag_id": 200119, + "tag_name": "爬山算法" + }, + { + "tag_id": 97632, + "tag_name": "模拟退火算法" + }, + { + "tag_id": 7382, + "tag_name": "贪心算法" + }, + { + "tag_id": 75556, + "tag_name": "排序算法" + }, + { + "tag_id": 80623, + "tag_name": "决策树" + }, + { + "tag_id": 82472, + "tag_name": "最小二乘法" + }, + { + "tag_id": 127818, + "tag_name": "逻辑回归" + }, + { + "tag_id": 2777, + "tag_name": "线性回归" + }, + { + "tag_id": 125113, + "tag_name": "支持向量机" + }, + { + "tag_id": 200128, + "tag_name": "近邻算法" + }, + { + "tag_id": 200129, + "tag_name": "均值算法" + }, + { + "tag_id": 76792, + "tag_name": "kmeans" + }, + { + "tag_id": 105125, + "tag_name": "随机森林" + }, + { + "tag_id": 77715, + "tag_name": "leetcode" + }, + { + "tag_id": 200133, + "tag_name": "预编码算法" + }, + { + "tag_id": 92729, + "tag_name": "b树" + }, + { + "tag_id": 200135, + "tag_name": "霍夫曼树" + }, + { + "tag_id": 200136, + "tag_name": "剪枝" + }, + { + "tag_id": 200137, + "tag_name": "哈希算法" + }, + { + "tag_id": 128198, + "tag_name": "推荐算法" + } + ] + }, + { + "category_id": "14", + "category_name": "人工智能", + "tags": [ + { + "tag_id": 7798, + "tag_name": "计算机视觉" + }, + { + "tag_id": 81858, + "tag_name": "自然语言处理" + }, + { + "tag_id": 7741, + "tag_name": "语音识别" + }, + { + "tag_id": 200142, + "tag_name": "机器翻译" + }, + { + "tag_id": 9056, + "tag_name": "机器学习" + }, + { + "tag_id": 76498, + "tag_name": "神经网络" + }, + { + "tag_id": 75181, + "tag_name": "深度学习" + }, + { + "tag_id": 101797, + "tag_name": "知识图谱" + }, + { + "tag_id": 8506, + "tag_name": "目标检测" + }, + { + "tag_id": 95981, + "tag_name": "目标跟踪" + }, + { + "tag_id": 128486, + "tag_name": "生成对抗网络" + }, + { + "tag_id": 200150, + "tag_name": "语言模型" + }, + { + "tag_id": 95253, + "tag_name": "tensorflow" + }, + { + "tag_id": 131351, + "tag_name": "pytorch" + }, + { + "tag_id": 200153, + "tag_name": "oneflow" + }, + { + "tag_id": 772, + "tag_name": "opencv" + }, + { + "tag_id": 101531, + "tag_name": "keras" + }, + { + "tag_id": 75179, + "tag_name": "caffe" + }, + { + "tag_id": 82402, + "tag_name": "sklearn" + }, + { + "tag_id": 130622, + "tag_name": "mxnet" + }, + { + "tag_id": 200159, + "tag_name": "mlnet" + }, + { + "tag_id": 85155, + "tag_name": "mllib" + }, + { + "tag_id": 200161, + "tag_name": "paddlepaddle" + }, + { + "tag_id": 82889, + "tag_name": "cnn" + }, + { + "tag_id": 105695, + "tag_name": "rnn" + }, + { + "tag_id": 125783, + "tag_name": "lstm" + }, + { + "tag_id": 200165, + "tag_name": "gru" + }, + { + "tag_id": 127146, + "tag_name": "dnn" + }, + { + "tag_id": 200167, + "tag_name": "mnn" + }, + { + "tag_id": 200168, + "tag_name": "boosting" + }, + { + "tag_id": 200169, + "tag_name": "transformer" + }, + { + "tag_id": 88461, + "tag_name": "word2vec" + }, + { + "tag_id": 200171, + "tag_name": "xlnet" + }, + { + "tag_id": 200172, + "tag_name": "bert" + } + ] + }, + { + "category_id": "21", + "category_name": "开发工具", + "tags": [ + { + "tag_id": 133820, + "tag_name": "idea" + }, + { + "tag_id": 101801, + "tag_name": "jupyter" + }, + { + "tag_id": 12123, + "tag_name": "pycharm" + }, + { + "tag_id": 86148, + "tag_name": "vscode" + }, + { + "tag_id": 5, + "tag_name": "eclipse" + }, + { + "tag_id": 72486, + "tag_name": "vim" + }, + { + "tag_id": 134720, + "tag_name": "phpstorm" + }, + { + "tag_id": 133738, + "tag_name": "myeclipse" + }, + { + "tag_id": 235, + "tag_name": "git" + }, + { + "tag_id": 233, + "tag_name": "github" + }, + { + "tag_id": 2236, + "tag_name": "svn" + }, + { + "tag_id": 200184, + "tag_name": "visualstudio" + }, + { + "tag_id": 97326, + "tag_name": "postman" + } + ] + }, + { + "category_id": 1008, + "category_name": "网络", + "tags": [ + { + "tag_id": 88795, + "tag_name": "网络协议" + }, + { + "tag_id": 6133, + "tag_name": "网络安全" + }, + { + "tag_id": 92581, + "tag_name": "tcp/ip" + }, + { + "tag_id": 555, + "tag_name": "udp" + }, + { + "tag_id": 2, + "tag_name": "http" + }, + { + "tag_id": 625, + "tag_name": "https" + }, + { + "tag_id": 624, + "tag_name": "ssl" + }, + { + "tag_id": 170, + "tag_name": "p2p" + }, + { + "tag_id": 11493, + "tag_name": "tcpdump" + }, + { + "tag_id": 2125, + "tag_name": "wireshark" + }, + { + "tag_id": 6071, + "tag_name": "websocket" + } + ] + }, + { + "category_id": 1009, + "category_name": "嵌入式", + "tags": [ + { + "tag_id": 122, + "tag_name": "arm" + }, + { + "tag_id": 80946, + "tag_name": "物联网" + }, + { + "tag_id": 127778, + "tag_name": "iot" + }, + { + "tag_id": 80507, + "tag_name": "mcu" + }, + { + "tag_id": 7886, + "tag_name": "51单片机" + }, + { + "tag_id": 2699, + "tag_name": "stm32" + }, + { + "tag_id": 78112, + "tag_name": "proteus" + }, + { + "tag_id": 101008, + "tag_name": "嵌入式硬件" + }, + { + "tag_id": 2282, + "tag_name": "单片机" + }, + { + "tag_id": 200206, + "tag_name": "嵌入式实时数据库" + }, + { + "tag_id": 200207, + "tag_name": "rtdbs" + } + ] + }, + { + "category_id": "19", + "category_name": "区块链", + "tags": [ + { + "tag_id": 108369, + "tag_name": "区块链" + }, + { + "tag_id": 200209, + "tag_name": "信任链" + }, + { + "tag_id": 125174, + "tag_name": "比特币" + }, + { + "tag_id": 200211, + "tag_name": "libra" + }, + { + "tag_id": 108368, + "tag_name": "以太坊" + }, + { + "tag_id": 200213, + "tag_name": "数字货币" + }, + { + "tag_id": 200214, + "tag_name": "去中心化" + }, + { + "tag_id": 200215, + "tag_name": "分布式账本" + }, + { + "tag_id": 200216, + "tag_name": "共识算法" + }, + { + "tag_id": 200217, + "tag_name": "同态加密" + }, + { + "tag_id": 200218, + "tag_name": "零知识证明" + } + ] + }, + { + "category_id": 1011, + "category_name": "移动开发", + "tags": [ + { + "tag_id": 126122, + "tag_name": "flutter" + }, + { + "tag_id": 6, + "tag_name": "ios" + }, + { + "tag_id": 31, + "tag_name": "xcode" + }, + { + "tag_id": 3, + "tag_name": "android" + }, + { + "tag_id": 88086, + "tag_name": "xamarin" + }, + { + "tag_id": 105129, + "tag_name": "reactnative" + } + ] + }, + { + "category_id": "3", + "category_name": "微软技术", + "tags": [ + { + "tag_id": 200225, + "tag_name": ".netcore" + }, + { + "tag_id": 5152, + "tag_name": "asp.net" + }, + { + "tag_id": 288, + "tag_name": "c#" + }, + { + "tag_id": 82780, + "tag_name": "typescript" + }, + { + "tag_id": 2415, + "tag_name": "linq" + }, + { + "tag_id": 124081, + "tag_name": "hololens" + }, + { + "tag_id": 200086, + "tag_name": "mssql" + }, + { + "tag_id": 133843, + "tag_name": "sqlserver" + }, + { + "tag_id": 77352, + "tag_name": "azure" + }, + { + "tag_id": 778, + "tag_name": "wpf" + }, + { + "tag_id": 840, + "tag_name": "mfc" + }, + { + "tag_id": 576, + "tag_name": ".net" + } + ] + }, + { + "category_id": "24", + "category_name": "测试", + "tags": [ + { + "tag_id": 6525, + "tag_name": "单元测试" + }, + { + "tag_id": 200234, + "tag_name": "模块测试" + }, + { + "tag_id": 122726, + "tag_name": "集成测试" + }, + { + "tag_id": 200236, + "tag_name": "测试覆盖率" + }, + { + "tag_id": 78038, + "tag_name": "压力测试" + }, + { + "tag_id": 200238, + "tag_name": "安全性测试" + }, + { + "tag_id": 75519, + "tag_name": "测试工具" + }, + { + "tag_id": 200240, + "tag_name": "威胁分析" + }, + { + "tag_id": 79491, + "tag_name": "测试用例" + }, + { + "tag_id": 200242, + "tag_name": "可用性测试" + }, + { + "tag_id": 96395, + "tag_name": "ab测试" + } + ] + }, + { + "category_id": 1014, + "category_name": "软件工程", + "tags": [ + { + "tag_id": 200244, + "tag_name": "个人开发" + }, + { + "tag_id": 79886, + "tag_name": "需求分析" + }, + { + "tag_id": 200246, + "tag_name": "规格说明书" + }, + { + "tag_id": 79940, + "tag_name": "结对编程" + }, + { + "tag_id": 200248, + "tag_name": "极限编程" + }, + { + "tag_id": 80356, + "tag_name": "团队开发" + }, + { + "tag_id": 200250, + "tag_name": "敏捷流程" + }, + { + "tag_id": 84005, + "tag_name": "sprint" + }, + { + "tag_id": 83933, + "tag_name": "scrum" + }, + { + "tag_id": 75494, + "tag_name": "jira" + }, + { + "tag_id": 8311, + "tag_name": "tfs" + } + ] + }, + { + "category_id": 1015, + "category_name": "设计模式", + "tags": [ + { + "tag_id": 3409, + "tag_name": "uml" + }, + { + "tag_id": 76224, + "tag_name": "开闭原则" + }, + { + "tag_id": 200257, + "tag_name": "里氏替换原则" + }, + { + "tag_id": 200258, + "tag_name": "依赖倒置原则" + }, + { + "tag_id": 200259, + "tag_name": "单一职责原则" + }, + { + "tag_id": 200260, + "tag_name": "接口隔离原则" + }, + { + "tag_id": 200261, + "tag_name": "迪米特法则" + }, + { + "tag_id": 200262, + "tag_name": "合成复用原则" + }, + { + "tag_id": 74366, + "tag_name": "单例模式" + }, + { + "tag_id": 200264, + "tag_name": "原型模式" + }, + { + "tag_id": 133407, + "tag_name": "简单工厂模式" + }, + { + "tag_id": 200266, + "tag_name": "工厂方法模式" + }, + { + "tag_id": 200267, + "tag_name": "抽象工厂模式" + }, + { + "tag_id": 200268, + "tag_name": "建造者模式" + }, + { + "tag_id": 87467, + "tag_name": "代理模式" + }, + { + "tag_id": 200270, + "tag_name": "适配器模式" + }, + { + "tag_id": 87725, + "tag_name": "桥接模式" + }, + { + "tag_id": 200272, + "tag_name": "装饰器模式" + }, + { + "tag_id": 200273, + "tag_name": "外观模式" + }, + { + "tag_id": 200274, + "tag_name": "享元模式" + }, + { + "tag_id": 200275, + "tag_name": "组合模式" + }, + { + "tag_id": 200276, + "tag_name": "模板方法模式" + }, + { + "tag_id": 200277, + "tag_name": "策略模式" + }, + { + "tag_id": 85807, + "tag_name": "命令模式" + }, + { + "tag_id": 200279, + "tag_name": "责任链模式" + }, + { + "tag_id": 200280, + "tag_name": "状态模式" + }, + { + "tag_id": 96217, + "tag_name": "观察者模式" + }, + { + "tag_id": 200282, + "tag_name": "中介者模式" + }, + { + "tag_id": 99090, + "tag_name": "迭代器模式" + }, + { + "tag_id": 97798, + "tag_name": "访问者模式" + }, + { + "tag_id": 200285, + "tag_name": "备忘录模式" + }, + { + "tag_id": 200286, + "tag_name": "解释器模式" + } + ] + }, + { + "category_id": 1016, + "category_name": "操作系统", + "tags": [ + { + "tag_id": 479, + "tag_name": "linux" + }, + { + "tag_id": 2231, + "tag_name": "windows" + }, + { + "tag_id": 75722, + "tag_name": "gnu" + }, + { + "tag_id": 104751, + "tag_name": "macos" + }, + { + "tag_id": 200291, + "tag_name": "blackberry" + }, + { + "tag_id": 135203, + "tag_name": "harmonyos" + }, + { + "tag_id": 2367, + "tag_name": "centos" + }, + { + "tag_id": 587, + "tag_name": "ubuntu" + }, + { + "tag_id": 121397, + "tag_name": "risc-v" + } + ] + } +] \ No newline at end of file