Advertisement

人工智能和云计算带来的技术变革:供应链管理的优化与智能化

阅读量:

1.背景介绍

1.1 供应链管理简介

供应链管理(Supply Chain Management)旨在将产品或服务从消费者手中采购至最终用户的整个过程中涉及的各种环节进行系统化管理。其中最为关键的便是供需双方的精准匹配。优化运营流程以提高效率的同时,在创造更多价值的基础上推动企业的收入增长,则为企业实现利润最大化及成本控制提供可靠途径。在构建稳健且高效的供应链体系方面,则需要采取一系列科学合理的措施以保障产品的顺畅流通并满足顾客需求。该领域主要涵盖以下几个核心环节:

  1. 消费者行为调研:深入剖析消费者兴趣、偏好以及愿意购买的产品或服务。
  2. 供应链管理规划:明确各部门职责并对资源进行优化配置,并构建财务核算体系以提升运营效率与经济效益。
  3. 技术支持与管理:利用现有IT技术实现智能化管理从而降低人力成本并减少时间消耗。
  4. 供应商选择与采购策略优化分析:通过评估市场供应能力及产品价格走势制定科学合理的供应商选择方案并优化采购流程以降低采购成本并快速适应市场变化

1.2 云计算简介

云计算基于互联网的技术扩展了数据中心。公共云平台存储了应用程序、数据以及计算资源,并让用户能够灵活获取所需的服务。云计算不仅能够扩大规模,在需要时也能缩减规模。简单地说... 云计算就像把一个强大的服务器放在你的家里。你可以随时登录使用它,并不需要等待原来的服务器。对企业而言... 云计算提供了弹性伸缩的能力是无限的... 能够适应市场需求并提升竞争力

1.3 云供应链管理的发展

传统供应链管理主要采用实体物理的线下配送模式,在这种架构下必然会产生较高的固定成本投入,并伴随运作效率相对较低的问题。现代供应链管理体系致力于优化上述问题,在这一过程中得到了云计算、大数据等技术的支持与推动作用。这些新兴技术的发展使得整个行业向着"智能化+"的新发展阶段迈进

  1. 云计算技术
  • 可以按需分配弹性资源
  • 提高效率和灵活性
  • 更加安全可靠
  1. 大数据技术
  • 对海量数据进行存储、处理以及详细解析

    • 对数据展开深入研究,并通过分析实现以数据驱动决策
    • 动态监测业务运行状况并优化决策效果
    1. 人工智能技术
  • 通过超级计算机的训练来推动人工智能模型的生成

    • 通过数据分析数据特征、总结历史趋势以及预测未来走向
    1. 智能硬件技术
  • 依托个体或团队智慧实现智能化应用

  • 充分利用物联网终端设备完成数据采集、传输、处理和分析工作。通过运用这四大技术手段进一步优化供应链管理效率,并能更加灵活地应对市场变化带来的挑战;同时能够增强企业核心竞争力。

2.核心概念与联系

2.1 知识图谱

知识图谱是表示实体间关系的一种方式,并包含三个主要部分:实体信息(Entity)、关系信息(Relation)和属性信息(Attribute)。以下列举其主要特点:

  1. 制定系统性阐述事物间关联性的策略,并整合复杂的事物。
  2. 提供全面的信息传递渠道以支撑后续分析工作。
  3. 适用于包括文本挖掘、信息检索以及数据分析等多个领域。
  4. 在深入理解了知识图谱的基本概念之后,则可以在供应链管理中深入探讨其相关实体及其关系与属性之间的联系。

2.2 实体

供应链管理领域内的实体一般可分为供应商方、客户方、商品以及订单信息等类别。举例而言,“阿里巴巴集团有限公司”的标识码代表的是一个企业法人的法人身份。具体来说,“马云”的标识码对应的是一个自然人的身份信息。举例来说,“某 University”的标识码代表的是一个法人或其他组织的身份编码。

2.3 属性

属性即为与实体相关的相关信息。比如一个实体若为公司则其属性可能涵盖地址业务领域以及规模等方面。在知识图谱中属性表现为节点的标签信息。

2.4 关系

表征两个实体之间的联系关系。例如,在实体A需求与实体B的商品或服务存在时,则可推断实体A与实体B间存在某种类型的联系关系。在知识图谱中,这种联系关系被表现为边

2.5 实体和关系组成的知识图谱

基于实体与关系的知识图谱框架中

2.6 混合模型的构建

知识图谱构成构建供应链管理混合模型的基础。完善的知识图谱不仅能够促进各领域专家的有效协作还能显著提升整体系统运行效能与决策精度。接下来将介绍知识图谱在供应链管理中的具体应用

2.7 实体识别

该过程涉及供应链管理的关键环节。识别人体可获取此类信息。从而实现供应链细化管理。首先基于知识图谱数据库中的规则识别人体。然后明确其实质内容。通常涉及人工智能算法与推理机制。

实体识别算法:

  • 正则表达式
  • 模板匹配
  • 层次聚类法
  • 条件随机场
  • 支持向量机
  • 最大熵模型

2.8 实体分类

另一种关键环节是实体识别过程中的分层划分工作。
只有经过精确分类, 才能明确其实体所代表的具体意义。
这一目标在于通过更有效地组织与分析知识来建立各实体间的联系。
具体而言, 分类工作主要包含两个步骤: 首先设定明确的判别标准; 其次依据这些标准开展实际划分工作。
接下来, 我们将深入探讨几种常见的实体识别技术及其应用。

2.8.1 基于规则的实体分类

基于某种机制的实体识别过程旨在利用预设的标准来划分知识图谱中的不同实体。在实际应用中可能采用模式识别技术来实现对这类信息的有效分门别类。具体步骤如下:

  1. 基于知识图谱数据库中实体类型的分析与研究,制定相应的匹配规则;
  2. 应用所述规则完成知识图谱中实体的匹配过程;
  3. 将匹配得到的实体归类于相应的类别。

优点:

  1. 简单快速,容易实现
  2. 可控性强,人工指定规则比较固定

缺点:

  1. 无法处理实体上下文语境信息
  2. 不够精确

2.8.2 基于统计的实体分类

利用统计方法进行实体分类即为依据实体出现频率和相似性来进行划分。当某一类别的实例在语料库中出现次数越多时,则该实例更可能归属于该类别。在计算过程中若两个实例具有较高的相似度,则它们倾向于被归入同一个类别。具体步骤如下:

从知识图谱中获取训练数据与测试数据,并从知识图谱中提取这两部分数据作为学习与评估的基础;
主要采用了贝叶斯统计方法及隐马尔可夫模型等统计技术来进行建模过程;
通过分析这些实体的数据特征来进行分类任务;

优点:

  1. 基于实体出现的频率和相近程度进行划分,则可更有效地解决实体分类问题。
  2. 这种技术有助于有效地去除那些与目标无关或不相关的数据。

缺点:

  1. 需要大量训练数据才能得到较好的结果

2.8.3 基于神经网络的实体分类

基于神经网络的技术用于实现对知识图谱中实体的分类工作。该模型接收关于实体的信息作为输入,并通过分析这些信息后将被归类到不同的类别中。具体流程如下:

  1. 基于训练数据集生成具有明确输入和输出的样本数据。
  2. 采用神经网络架构构建模型结构。
  3. 通过训练优化模型参数。
  4. 检验实际预测能力并评估模型性能。
  5. 基于测试数据集进一步优化并调优以提高预测精度和准确性。

优点:

  1. 经过对模型进行训练, 进一步加深了对实体所属不同类别以及它们在整体中的分布情况的理解
  2. 在实践中能够有效地应对实体分类问题

缺点:

  1. 需要大量的训练数据
  2. 需要大量的时间和资源

2.8.4 基于深度学习的实体分类

基于深度学习的知识图谱构建过程主要包含以下内容:首先是对知识图谱中的实体进行分类利用深度学习技术对知识图谱中的不同类别的实体进行识别和划分这一过程能够帮助更好地组织和管理大规模的知识数据其次通过提取与每个实体相关的上下文信息构建其语义表示从而实现精准的分类任务具体而言该系统会按照以下步骤开展工作首先是特征提取将与目标实体相关的文本信息转化为可被模型处理的数据形式接着是特征编码将这些原始数据进一步抽象为高维向量表示最后是分类决策通过比较编码后的特征向量与已知类别实例之间的相似度最终确定待分类实体所属的具体类别

  1. 基于训练数据集构建具有输入输出特征的数据样本集合;
  2. 通过深度学习框架设计并建立模型架构;
  3. 对构建好的模型进行训练过程;
  4. 转换至测试环境并分析测试结果以评估当前模型性能;
  5. 基于测试数据集进一步优化并微调模型参数以使实际应用效果显著提升。

优点:

借助深度学习技术的运用,在人工智能系统中可以通过自动化流程完成特征提取、模型训练以及参数优化等环节的操作,并最终实现更高的分类准确率。在实际应用场景中,该系统能够有效解决各种实体分类问题。

缺点:

  1. 需要大量的训练数据
  2. 需要大量的时间和资源

2.9 实体关联

实体关联是关系识别的一种机制,旨在从知识图谱中识别出各实体间的相互联系。借助于这种机制的应用,则有助于深入解析各实体间的相互作用。其核心通常包括两大功能维度:一是实现 entity discovery ( entity发现),二是完成 entity linking ( entity 链接)。下面我们将介绍这两类方法的具体实现原理及应用场景。

2.9.1 实体发现

实体发现主要涉及识别和分类文本中的具体事物或概念信息。该过程通常遵循特定的标准或程序来识别这些信息并确定其对应的实体类别。在这一过程中,通常会经历三个关键步骤:第一步是分词技术的应用;第二步则是借助自然语言处理模型完成命名实体识别;第三步则是针对多义词或其他复杂现象进行消歧处理以确保准确性的一致性。下面将介绍这一技术的两种典型实现方法及其应用特点

分词

分词的本质就是将连续的文字分割成独立的词语。其主要目标在于将一段文字分解为独立的词语。如今广泛使用的主流分词工具包括LTP(Language Technology Platform)和Stanford Core NLP等。下面,我们介绍LTP的分词示例代码:

复制代码
    import ltp
    
    # 初始化模型
    model = ltp.SentenceSplitter()
    
    # 分割句子
    sentences = model.split('你好,欢迎来到京东!')
    
    print("分割后的句子:")
    for sentence in sentences:
    print(sentence)
    
      
      
      
      
      
      
      
      
      
      
    
    代码解读

输出结果为:

复制代码
    分割后的句子:
    你好
    ,
    欢迎
    来到
    京东
    !
    
      
      
      
      
      
      
    
    代码解读
命名实体识别

名实体识别旨在识别文本中特定意义的对象或信息。其工作流程包括两个主要阶段:一是知识库的构建;二是基于构建的知识库进行名实体识别。现有主流工具包括如Stanford NER Toolkit、NLTK等工具。以下将介绍如何利用NLTK实现名实体识别的具体代码实例

复制代码
    import nltk
    
    # 下载必要的数据包
    nltk.download('averaged_perceptron_tagger')
    nltk.download('maxent_ne_chunker')
    nltk.download('words')
    
    text = "阿里巴巴在美国纽约注册了一个商标"
    
    # 分词
    tokens = nltk.word_tokenize(text)
    
    # 词性标注
    pos_tags = nltk.pos_tag(tokens)
    
    # 命名实体识别
    named_entities = []
    current_entity = ""
    for tag in pos_tags:
    if current_entity == "":
        # 如果没有正在构建的实体,则创建一个新的实体
        if tag[1] in ['ORGANIZATION', 'PERSON']:
            current_entity += str(tag[0]) + "/" + tag[1].lower()
    else:
        # 如果正在构建的实体,则判断是否是新的实体
        if tag[1][0]!= 'N':
            named_entities.append((current_entity[:-1], current_entity[-1]))
            current_entity = ""
        elif tag[1] in ['ORGANIZATION', 'PERSON'] and len(str(tag[0]).replace(".", "")) > 1:
            current_entity += str(tag[0]) + "/" + tag[1].lower()
    
    if current_entity!= '':
    named_entities.append((current_entity[:-1], current_entity[-1]))
    
    # 打印命名实体
    print("命名实体:")
    for entity in named_entities:
    print("- {} ({})".format(entity[0], entity[1]))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

输出结果为:

复制代码
    命名实体:
    - 阿里巴巴 (organization)
    - 美国 (location)
    - 纽约 (location)
    - 注册 (verb)
    - 商标 (noun)
    
      
      
      
      
      
    
    代码解读
实体消岐

实体识别旨在识别多个命名实体间的歧义并确定唯一的目标实体。识别的方法包括最大路径消歧与最小覆盖消歧等技术。以下具体介绍最大路径消歧与最小覆盖消歧的相关代码实现。

实体识别旨在识别多个命名实体间的歧义并确定唯一的目标实体。识别的方法包括最大路径消歧与最小覆盖消歧等技术。以下具体介绍最大路径消歧与最小覆盖消歧的相关代码实现。

最大路径消岐

优先消歧最大的概率路径是指每次优先选择概率最高的路径作为结果,并在所有相关节点处进行计算;当所有相关节点处都完成计算后,则返回计算结果并结束程序。代码如下:

复制代码
    def max_path_disambiguation(graph):
    
    def find_root(graph):
        root = None
        for node in graph:
            has_in_degree = False
            for edge in graph[node]:
                if edge[1] == -1:
                    return node
                else:
                    has_in_degree = True
                    break
            if not has_in_degree:
                return node
    
        return root
    
    def build_edges(tokens, tags):
        edges = [[False, -1]] * len(tokens)
        i = 1
        while i < len(tokens):
            j = i
            start = j
            while j < len(tokens) and tags[j] == "NNP":
                j += 1
    
            end = j - 1
            token = "".join([t.strip("#") for t in tokens[start:end]])
            edges[i-1] = [True, nodes.index(token)]
            i = j
    
        return edges
    
    def remove_nodes(graph, selected):
        result = {}
        for u in range(len(graph)):
            if u not in selected:
                continue
    
            result[u] = [(v, w) for v, w in graph[u] if v in selected]
    
        return result
    
    def is_connected(selected):
        used = set()
        stack = list(selected.keys())
        visited = {stack[0]}
    
        while stack:
            vertex = stack.pop()
            if vertex not in used:
                used.add(vertex)
    
                neighbors = [edge[0] for edge in graph[vertex] if edge[1] >= 0]
                stack.extend(neighbors - visited)
                visited |= neighbors
    
        return len(used) == len(selected)
    
    
    nodes = sorted({n for n in graph} | {-1})
    roots = [find_root(graph), -1]
    for u in reversed(roots):
        paths = {(w, []) for w in nodes}
        queue = [(u, [])]
    
        while queue:
            parent, path = queue.pop(0)
    
            for child, weight in graph[parent]:
                if child == -1 or (child not in paths and child in selected):
                    continue
    
                new_path = path + [(weight, child)]
    
                paths[child] = min(paths[child], key=lambda x: len(x)) \
                                if child in paths else new_path
    
                queue.append((child, new_path))
    
        selected = dict([(w, k) for k, v in paths.items() for w in v])
        if is_connected(selected):
            return selected
    
    raise Exception("Cannot disambiguate entities.")
    
    
    # 假设这里有一条文本,里面有三个实体
    text = "新浪和网易打败腾讯,成为国内游戏厂商第一股!"
    tokens = ["新浪", "网易", "腾讯"]
    tags = ["NNP", "NNP", "NNP"]
    
    # 构造实体连接图
    graph = {}
    for i in range(len(tokens)):
    graph[i] = []
    for j in range(len(tokens)):
        if i!= j and tags[i][:2] == tags[j][:2]:
            graph[i].append((j, abs(i-j)))
    
    # 最大路径消岐
    selected = max_path_disambiguation(graph)
    result = {"{}/{}".format(k, v): tokens[k].strip('#') for k, v in selected.items()}
    
    # 打印消岐结果
    print("消岐结果:{}".format(result))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

输出结果为:

复制代码
    消岐结果:{'0/NNP': '新浪', '2/NNP': '腾讯'}
    
    
    代码解读
最小覆盖消岐

最小覆盖消岐是指每次选择距离最小的实体作为结果。代码如下:

复制代码
    def min_coverage_disambiguation(graph, text, tags):
    """
    :param graph: 实体连接图
    :param text: 文本
    :param tags: 词性标注结果
    :return: 消岐结果字典
    """
    def extract_chunks(graph, chunks, chunk_type):
        all_children = set()
        for node in graph:
            children = set()
            for edge in graph[node]:
                if edge[1] >= 0:
                    children.add(edge[1])
                    all_children.add(edge[1])
    
            if len(children) == 0 and chunk_type == "NP":
                leafs.append(([node], []))
            elif len(children) == 1 and list(children)[0] not in chunks:
                chunk_label = "{}:{}".format(node, chunk_type)
                labels.append(chunk_label)
                words = get_words(labels.index(chunk_label)-1, labels.index(chunk_label)+1, text)
                if chunk_type == "NP":
                    leafs.append((get_np_leaves(words), labels.index(chunk_label)-1))
                else:
                    leaves = get_leaf_positions(words, tags)
                    leafs.append((leaves, labels.index(chunk_label)-1))
                del words[:]
    
        for node in all_children:
            if node not in graph:
                continue
    
            for p, c, _ in graph[node]:
                if c not in chunks and p in chunks:
                    sub_chunk = chunks[p][:]
                    sub_chunk.append(c)
                    if c not in seen_children:
                        chunks[c] = tuple(sub_chunk)
                        seen_children.add(c)
    
                    add_to_chunks(graph, chunks, seen_nodes, node)
    
    def get_words(start, end, text):
        words = []
        word = ''
        for i in range(start, end):
            char = text[i]
            if char in (' ', '\t'):
                if word!= '':
                    words.append(word)
                word = ''
            elif char == ',' or char == ';' or char == '.':
                if word!= '':
                    words.append(word)
                words.append(char)
                word = ''
            else:
                word += char
    
        if word!= '':
            words.append(word)
    
        return words
    
    def get_leaf_positions(words, tags):
        positions = []
        position = 0
        last_position = 0
    
        for i in range(len(tags)):
            if tags[i] == '.' or tags[i] == ',' or tags[i] == ';':
                if position == last_position:
                    continue
                positions.append(last_position)
                position = i + 1
            elif tags[i][:2] == 'JJ' or tags[i][:2] == 'RB':
                if position == last_position:
                    continue
                positions.append(last_position)
                position = i + 1
            elif tags[i][:2] == 'VB':
                if position == last_position:
                    continue
                position = i + 1
            else:
                pass
    
            if i == len(tags) - 1:
                positions.append(last_position)
    
        return positions
    
    def get_np_leaves(words):
        np_leaves = []
        index = 0
    
        for i in range(len(words)):
            if i > index and words[i] not in ("and", ",", ";"):
                continue
    
            leaf = [i]
            j = i + 1
            while j < len(words) and words[j].isalnum():
                leaf.append(j)
                j += 1
    
            np_leaves.append(tuple(leaf))
            index = j
    
        return np_leaves
    
    def add_to_chunks(graph, chunks, seen_nodes, node):
        for p, c, w in graph[node]:
            if c not in seen_nodes and c not in chunks:
                sub_chunk = ([node], [])
                chunks[c] = tuple(sub_chunk)
                seen_nodes.add(c)
                add_to_chunks(graph, chunks, seen_nodes, c)
            elif c in seen_nodes and p in chunks:
                sub_chunk = chunks[p][:]
                sub_chunk[0].append(node)
                chunks[c] = tuple(sub_chunk)
                seen_nodes.add(c)
                add_to_chunks(graph, chunks, seen_nodes, c)
    
    def merge_chunks(chunks, root=-1):
        merged_chunks = []
        for label, chunk in chunks.items():
            overlap = False
            for m in merged_chunks:
                if chunk[1][0] <= m[1][1] and m[1][0] <= chunk[1][1]:
                    overlap = True
                    m[1] = (min(m[1][0], chunk[1][0]), max(m[1][1], chunk[1][1]))
    
            if not overlap:
                merged_chunks.append(list(chunk) + [label])
    
        return merged_chunks
    
    # 获取所有叶结点位置
    leaves = get_leaf_positions(get_words(0, len(text), text), tags)
    
    # 获取实体连接图
    labeled_graph = defaultdict(list)
    seen_nodes = set()
    seen_children = set()
    labels = []
    leafs = []
    for i in range(len(leaves)):
        for j in range(i+1, len(leaves)):
            distance = abs(leaves[i]-leaves[j])
            if tags[leaves[i]].startswith(('NN', 'NNS')) and tags[leaves[j]].startswith(('NN', 'NNS')):
                if distance <= MAX_DISTANCE:
                    labeled_graph[(leaves[i], distance)].append((leaves[j], distance))
                    seen_nodes.update((leaves[i], leaves[j]))
    
    # 检查实体连接图
    checked_graph = {}
    for node in labeled_graph:
        checked_graph[node] = sorted(labeled_graph[node], key=lambda x: x[1])
    
    # 检查叶结点数量是否超过最大数量限制
    if len(seen_nodes) > LEAFS_LIMIT:
        raise ValueError("Too many leaf nodes to process.")
    
    # 构建初始块
    initial_chunk = (-1, (0, len(leaves)), [])
    chunks = {0: initial_chunk}
    extract_chunks(checked_graph, chunks, "NP")
    seen_nodes.update(set(range(-1, len(leaves))))
    
    # 合并块
    final_chunks = merge_chunks(chunks)
    
    # 消岐结果字典
    results = {}
    for chunk in final_chunks:
        results[" ".join(get_words(*chunk[:2], text)).strip()] = sum([[int(i)]*len(l) for i, l in enumerate(final_chunks)][chunk[2]], []).count(1)/len(final_chunks)*100
    
    return results
    
    
    # 设置参数
    MAX_DISTANCE = 20   # 实体连接阈值
    LEAFS_LIMIT = 2    # 叶结点数量阈值
    
    # 假设这里有一个文本,里面有三个实体
    text = "新浪和网易打败腾讯,成为国内游戏厂商第一股!"
    tokens = ["新浪", "网易", "腾讯"]
    tags = ["NNP", "NNP", "NNP"]
    
    # 进行实体消岐
    results = min_coverage_disambiguation(labeled_graph, text, tags)
    
    # 打印消岐结果
    print("消岐结果:")
    for entity, percentage in results.items():
    print("{} ({:.2f}%)".format(entity, percentage))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

输出结果为:

复制代码
    消岐结果:
    新浪 (100.00%)
    网易 (100.00%)
    腾讯 (100.00%)
    
      
      
      
    
    代码解读

全部评论 (0)

还没有任何评论哟~