[公开]2026年度北京文旅投诉分转服务和文旅行业投诉大数据平台服务中标公告
中标评审分析官方公示数据
中标原因深度分析独家解读
020/cog
/README.md
import os
import sys
import numpy as np
from scipy.spatial.distance import cosine
from scipy.sparse.linalg import svds
from cog.utils import get_model_path, get_cache_path, get_save_path, get_logger
logger = get_logger(__name__)
class Embedding(object):
def __init__(self, model_path, cache_path, save_path, use_cache=False, use_save=False, **kwargs):
self.model_path = model_path
self.cache_path = cache_path
self.save_path = save_path
self.use_cache = use_cache
self.use_save = use_save
self.embeddings = None
self.word2idx = None
self.idx2word = None
def _init_embeddings(self):
"""
Load embeddings from model path
"""
if self.use_cache:
self.embeddings, self.word2idx, self.idx2word = self._load_from_cache()
else:
self.embeddings, self.word2idx, self.idx2word = self._load_embeddings()
def _load_from_cache(self):
cache_path = get_cache_path(self.cache_path)
if not os.path.exists(cache_path):
logger.warning(f'{cache_path} does not exist, will download it.')
embeddings, word2idx, idx2word = self._load_embeddings()
np.savez(cache_path, embeddings=embeddings, word2idx=word2idx, idx2word=idx2word)
else:
embeddings, word2idx, idx2word = np.load(cache_path)['embeddings'], np.load(cache_path)['word2idx'], np.load(cache_path)['idx2word']
return embeddings, word2idx, idx2word
def _load_embeddings(self):
if not os.path.exists(self.model_path):
logger.error(f'Error: Model path {self.model_path} does not exist. Please provide a valid model path.')
sys.exit(-1)
embeddings, word2idx, idx2word = self._load_from_file()
return embeddings, word2idx, idx2word
def _load_from_file(self):
embeddings, word2idx, idx2word = [], {}, {}
with open(self.model_path, 'r', encoding='utf-8') as f:
for line in f:
if len(line.strip()) == 0:
continue
tokens = line.strip().split(' ')
word = tokens[0]
vec = np.array([float(v) for v in tokens[1:]])
embeddings.append(vec)
idx2word[len(embeddings) - 1] = word
word2idx[word] = len(embeddings) - 1
embeddings = np.array(embeddings)
return embeddings, word2idx, idx2word
def get_embedding(self, word):
"""
Get embedding for a word
"""
if self.embeddings is None:
self._init_embeddings()
if word not in self.word2idx:
return None
idx = self.word2idx[word]
return self.embeddings[idx]
def get_embeddings(self):
"""
Get embeddings for all words
"""
if self.embeddings is None:
self._init_embeddings()
return self.embeddings
def get_word2idx(self):
"""
Get word2idx mapping
"""
if self.embeddings is None:
self._init_embeddings()
return self.word2idx
def get_idx2word(self):
"""
Get idx2word mapping
"""
if self.embeddings is None:
self._init_embeddings()
return self.idx2word
class Similarity(object):
def __init__(self, emb, metric='cosine', top_k=5):
self.emb = emb
self.metric = metric
self.top_k = top_k
def get_similar_words(self, word, top_k=None):
"""
Get similar words for a word
"""
if top_k is None:
top_k = self.top_k
if word not in self.emb.word2idx:
return None
idx = self.emb.word2idx[word]
emb = self.emb.embeddings[idx]
distances = []
for i in range(self.emb.embeddings.shape[0]):
if i != idx:
distance = cosine(emb, self.emb.embeddings[i])
distances.append(distance)
sorted_indices = sorted(range(len(distances)), key=lambda k: distances[k])[:top_k]
return [self.emb.idx2word[i] for i in sorted_indices]
class Similarity2(Similarity):
def __init__(self, emb, metric='cosine', top_k=5):
super().__init__(emb, metric, top_k)
def get_similar_words(self, word, top_k=None):
if top_k is None:
top_k = self.top_k
if word not in self.emb.word2idx:
return None
idx = self.emb.word2idx[word]
emb = self.emb.embeddings[idx]
distances = []
for i in range(self.emb.embeddings.shape[0]):
if i != idx:
distance = cosine(emb, self.emb.embeddings[i])
distances.append(distance)
sorted_indices = sorted(range(len(distances)), key=lambda k: distances[k], reverse=True)[:top_k]
return [self.emb.idx2word[i] for i in sorted_indices]
class Similarity3(Similarity):
def __init__(self, emb, metric='cosine', top_k=5):
super().__init__(emb, metric, top_k
一、项目编号:11000026210200174852-XM001
二、项目名称:2026年度北京文旅投诉分转服务和文旅行业投诉大数据平台服务
三、中标(成交)信息
总中标成交金额:128 万元(人民币)
中标成交供应商名称、地址及中标成交金额:
中标成交供应商名称:首都信息发展股份有限公司
中标成交供应商地址:北京市海淀区西三环中路11号(中央电视塔底座北门)
中标金额:128万元
| 供应商名称 | 供应商地址 | 统一信用代码 | 中标金额 | 中标成交备注信息 |
|---|---|---|---|---|
| 首都信息发展股份有限公司 | 北京市海淀区西三环中路11号(中央电视塔底座北门) | 911100006336972074 | 128 万元 | 评审总得分(综合评分法): 90.24 分 |
四、主要标的信息
| 供应商 | 商品名称 | 规格型号 | 数量 | 单价 | 总价 | 服务要求 |
|---|---|---|---|---|---|---|
| 首都信息发展股份有限公司 | 1 | 128万元 | 128万元 | 服务要求:提供电脑端与手机端的“北京市文旅质监综合管理系统”,其中包含接诉即办、旅游投诉、行业投诉、北京文旅咨询服务电话四大业务板块。具体详见第五章采购需求。 |
项目用途:提供电脑端与手机端的“北京市文旅质监综合管理系统”,其中包含接诉即办、旅游投诉、行业投诉、北京文旅咨询服务电话四大业务板块。
合同履行期限:项目周期为2026年7月15日-2027年7月14日。
五、评审专家(单一来源采购人员)名单:
黄永生、姜越鹏、楚洁、李晓聪、吴喦
六、代理服务收费标准及金额:
本项目代理费总金额:1.724万元(人民币)
本项目代理费收费标准:
代理服务费收费标准参考《招标代理服务收费管理暂行办法》计价格[2002]1980号及《国家发展改革委办公厅关于招标代理服务收费有关问题的通知》发改办价格[2003]857号等文件有关收费标准执行。
七、公告期限
自本公告发布之日起1个工作日。
八、其它补充事宜
发布公告的媒介:中国政府采购网、北京市政府采购网。
九、凡对本次公告内容提出询问,请按以下方式联系。
1.采购人信息
名 称:北京市文化和旅游局市场质量监督与咨询服务中心
地址:北京市通州区留庄路1号院
联系方式:刘老师,010-55525850
2.采购代理机构信息
名 称:天恒招标有限公司
地 址:北京市东城区东四十条甲22号南新仓商务大厦B座922
联系方式:李雅奇、李亚娜、陈洁、徐梓瑶、刘戈,010-53399157、17710393237
3.项目联系方式
项目联系人:李雅奇、李亚娜、陈洁、徐梓瑶、刘戈
电 话: 010-53399157、17710393237
数据来源:查看官方原文 | 发布日期:2026-07-01