Dify中Jieba类的create()方法实现过程

本文主要介绍Dify中Jieba类的create()方法执行过程,重点是段(segment)的关键词的生成。

一.create方法流程概述

整个create方法的目的是为了处理一批文本,提取它们的关键词,并更新关键词表,以便于后续的关键词搜索和索引。这个过程通过获取锁来保证数据的一致性和操作的原子性。

create方法是Jieba类的一部分,用于处理文本列表,提取关键词,并更新关键词表。以下是该方法的详细解释:

1.初始化和锁定

方法首先构建一个锁名称,基于数据集的ID。然后,使用redis_client.lock获取一个锁,确保在关键词索引过程中,同一时间只有一个进程可以执行这个操作。锁的超时时间设置为600秒。

2.关键词表处理器

创建一个JiebaKeywordTableHandler实例,用于后续的关键词提取。

3.获取数据集关键词表

调用_get_dataset_keyword_table方法获取当前数据集的关键词表。如果关键词表不存在,则会创建一个新的。

4.遍历文本并提取关键词

对于传入的文本列表中的每个文本,使用JiebaKeywordTableHandlerextract_keywords方法提取关键词。提取的关键词数量由_config.max_keywords_per_chunk决定。

5.更新段关键词和关键词表

对于每个文本,调用_update_segment_keywords方法更新数据库中对应文档段的关键词。然后,调用_add_text_to_keyword_table方法将文本的ID和提取的关键词添加到关键词表中。

6.保存数据集关键词表

最后调用_save_dataset_keyword_table方法将更新后的关键词表保存回数据库或其它存储介质。

二._get_dataset_keyword_table方法(获取数据集关键词表)

源码位置:dify\api\core\rag\datasource\keyword\jieba\jieba.py

方法 _get_dataset_keyword_table 的目的是获取当前数据集的关键词表。如果数据集已经有一个关键词表,它会直接返回这个表。如果没有,它会根据配置创建一个新的关键词表,并保存到数据库或其它指定的数据源中。这个方法确保了无论何时调用,都能获取到一个关键词表用于后续的关键词处理操作。

def _get_dataset_keyword_table(self) -> Optional[dict]:  # 获取数据集关键词表
    dataset_keyword_table = self.dataset.dataset_keyword_table  # 获取数据集关键词表
    if dataset_keyword_table:  # 如果数据集关键词表存在
        keyword_table_dict = dataset_keyword_table.keyword_table_dict  # 获取关键词表字典
        if keyword_table_dict:  # 如果关键词表字典存在
            return keyword_table_dict['__data__']['table']  # 返回关键词表
    else:  # 如果数据集关键词表不存在
        keyword_data_source_type = current_app.config['KEYWORD_DATA_SOURCE_TYPE']  # 获取关键词数据源类型
        dataset_keyword_table = DatasetKeywordTable(
            dataset_id=self.dataset.id,
            keyword_table='',
            data_source_type=keyword_data_source_type,
        )  # 创建数据集关键词表
        if keyword_data_source_type == 'database':  # 如果关键词数据源类型是数据库
            dataset_keyword_table.keyword_table = json.dumps({
                '__type__': 'keyword_table',
                '__data__': {
                    "index_id": self.dataset.id,
                    "summary": None,
                    "table": {}
                }
            }, cls=SetEncoder)  # 设置关键词表
        db.session.add(dataset_keyword_table)
        db.session.commit()

    return {}

1.检查关键词表是否存在

首先,方法会检查当前数据集是否已经有一个关键词表对象。如果有,它会从这个对象中解析出关键词表的字典,并返回这个字典。

2.创建新的关键词表

如果当前数据集没有关键词表,方法会根据应用配置(例如,使用数据库作为数据源)创建一个新的关键词表对象。

3.保存关键词表到数据源

新创建的关键词表会被保存到配置指定的数据源中。如果数据源是数据库,关键词表对象会被保存到数据库并提交更改。

保存之前关键词表dataset_keyword_tables如下:

该方法执行完毕后,关键词表dataset_keyword_tables如下:

keyword_table内容如下所示:

{
        "__type__": "keyword_table",
        "__data__": {
                "index_id": "d961ab69-bd75-4880-be35-d0b3396484ce",
                "summary": null,
                "table": {
                    ......
                }
        }
}

4.返回关键词表

最后,方法返回新创建的空关键词表字典,以便于后续的关键词处理操作。

三.extract_keywords方法(提取关键词)

源码位置:dify\api\core\rag\datasource\keyword\jieba\jieba.py

接下来是遍历文本并提取关键词的过程:

JiebaKeywordTableHandler类代码如下:

源码位置:dify\api\core\rag\datasource\keyword\jieba\jieba_keyword_table_handler.py

class JiebaKeywordTableHandler:

    def __init__(self):
        default_tfidf.stop_words = STOPWORDS

    def extract_keywords(self, text: str, max_keywords_per_chunk: int = 10) -> set[str]:
        """Extract keywords with JIEBA tfidf."""  # 使用JIEBA tfidf提取关键词
        keywords = jieba.analyse.extract_tags(
            sentence=text,
            topK=max_keywords_per_chunk,
        )

        return set(self._expand_tokens_with_subtokens(keywords))

    def _expand_tokens_with_subtokens(self, tokens: set[str]) -> set[str]:
        """Get subtokens from a list of tokens., filtering for stopwords."""  # 从一组标记中获取子标记,过滤停用词
        results = set()
        for token in tokens:
            results.add(token)
            sub_tokens = re.findall(r"\w+", token)
            if len(sub_tokens) > 1:
                results.update({w for w in sub_tokens if w not in list(STOPWORDS)})

        return results

jieba.analyse.extract_tags()实际调用的是jieba.analyse.extract_tags.extract_tags()方法,即通过jieba tf-idf算法提取关键词,并且每个chunk最多有10个关键词。

jieba.analyse.extract_tags()方法执行完毕后就得到了10个关键词:

_expand_tokens_with_subtokens()方法的目的是从给定的一组关键词中进一步提取子关键词,并过滤掉停用词。这个方法能够帮助提高关键词的覆盖范围和细粒度,从而更准确地反映文本的内容。具体步骤如下:

1.初始化结果集

创建一个空的集合 results,用于存储最终的关键词和子关键词。

2.遍历关键词

对于传入的关键词集合 tokens 中的每一个关键词 token,执行以下操作:

  • 将当前关键词 token 直接添加到结果集 results 中,因为原始关键词本身也是有价值的。

  • 使用正则表达式 re.findall(r"\w+", token) 提取当前关键词中的所有子关键词(即分词)。这一步是为了获取更细粒度的词汇。

  • 如果提取出的子关键词数量大于1,即当前关键词可以进一步分解,那么对于每个子关键词 w,检查它是否不在停用词列表 STOPWORDS 中。如果是,将其添加到结果集 results 中。

3.返回结果

返回包含原始关键词和符合条件的子关键词的集合 results,这个集合中不包含任何停用词。

通过这个方法,可以从原始的关键词集合中进一步提炼出有意义的词汇,同时排除那些常见但对理解文本内容贡献不大的停用词,从而提高文本分析的准确性和深度。

最终返回的结果set(self._expand_tokens_with_subtokens(keywords))如下:

四._update_segment_keywords(更新段关键词)

源码位置:dify\api\core\rag\datasource\keyword\jieba\jieba.py

def _update_segment_keywords(self, dataset_id: str, node_id: str, keywords: list[str]):
    document_segment = db.session.query(DocumentSegment).filter(
        DocumentSegment.dataset_id == dataset_id,
        DocumentSegment.index_node_id == node_id
    ).first()
    if document_segment:
        document_segment.keywords = keywords
        db.session.add(document_segment)
        db.session.commit()

方法 _update_segment_keywords 的目的是更新特定文档段(DocumentSegment)的关键词列表。这个方法接收数据集ID(dataset_id)、节点ID(node_id)和关键词列表(keywords)作为参数。它首先查询数据库中对应的文档段,如果找到了相应的文档段,就将其关键词字段更新为传入的关键词列表,并将更新后的文档段对象保存回数据库。

1.查询文档段

使用 dataset_idnode_idDocumentSegment 表中查询对应的文档段实例。

2.更新关键词

如果查询到了文档段实例,就将其 keywords 字段更新为方法参数中传入的 keywords 列表。

3.保存更改

将更新后的文档段实例保存回数据库,并提交事务以确保更改被持久化。

五._add_text_to_keyword_table(更新段关键词表)

源码位置:dify\api\core\rag\datasource\keyword\jieba\jieba.py

def _add_text_to_keyword_table(self, keyword_table: dict, id: str, keywords: list[str]) -> dict:
    for keyword in keywords:
        if keyword not in keyword_table:
            keyword_table[keyword] = set()
        keyword_table[keyword].add(id)
    return keyword_table

方法 _add_text_to_keyword_table 的目的是将一组关键词与一个特定的文档段ID关联起来,并更新关键词表。这个方法接收一个关键词表字典 keyword_table、一个文档段的id,以及一个关键词列表 keywords 作为参数。它遍历关键词列表,对于每个关键词,如果这个关键词已经存在于关键词表中,则将当前文档段的ID添加到该关键词对应的ID集合中;如果这个关键词在关键词表中不存在,则首先为该关键词创建一个新的ID集合,然后将当前文档段的ID添加到这个新集合中。这样,关键词表就能够反映出每个关键词与哪些文档段相关联。

其中,id指的是document_segments数据表中的index_node_id字段。

六._save_dataset_keyword_table

源码位置:dify\api\core\rag\datasource\keyword\jieba\jieba.py

def _save_dataset_keyword_table(self, keyword_table):
    keyword_table_dict = {
        '__type__': 'keyword_table',
        '__data__': {
            "index_id": self.dataset.id,
            "summary": None,
            "table": keyword_table
        }
    }
    dataset_keyword_table = self.dataset.dataset_keyword_table
    keyword_data_source_type = dataset_keyword_table.data_source_type
    if keyword_data_source_type == 'database':
        # 序列化关键词表为JSON字符串
        dataset_keyword_table.keyword_table = json.dumps(keyword_table_dict, cls=SetEncoder)
        db.session.commit()
    else:
        file_key = 'keyword_files/' + self.dataset.tenant_id + '/' + self.dataset.id + '.txt'
        if storage.exists(file_key):
            storage.delete(file_key)
        storage.save(file_key, json.dumps(keyword_table_dict, cls=SetEncoder).encode('utf-8'))

方法 _save_dataset_keyword_table 的目的是将更新后的关键词表保存到数据库或其它指定的数据源中。这个方法接收一个关键词表字典 keyword_table 作为参数,并将其序列化后保存,以确保关键词表的更改被持久化。这是关键词管理流程中的一个重要步骤,确保了关键词表的更新能够反映到后续的关键词检索和分析中。

1.序列化关键词表

keyword_table 字典序列化为一个字符串或其它格式,以便于存储。这通常涉及到将字典转换为JSON格式。

2.保存到数据源

将序列化后的关键词表保存到指定的数据源中。如果数据源是数据库,这个步骤可能涉及到更新数据库中的一个特定记录,或者创建一个新的记录来存储关键词表。

3.提交更改

如果数据源支持事务(如数据库),需要提交事务以确保更改被持久化。

七.查看段落与关键词表

1.文档段落信息

知识库的每行文档包括文件名、字符数、召回次数、上传时间、状态、操作等字段。

从收到tasks.document_indexing_task.document_indexing_task[4b0b0392-006f-41c3-92a8-63bdd01978ca]任务到完成,以及使用jieba过程产生的日志。如下所示:

进入文档中可查看文档段信息,包括段落数量、段落内容、关键词、向量哈希等字段:

2.关键词表

数据集关键词表dataset_keyword_tables如下:

其中,keyword_table内容如下:

{
        "__type__": "keyword_table",
        "__data__": {
                "index_id": "d961ab69-bd75-4880-be35-d0b3396484ce",
                "summary": null,
                "table": {
                        "\u4e0d\u53ef\u601d\u8bae": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
                        "\u672a\u7720": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "702b015a-4e1c-446b-832c-d955fc466cdf", "ad23474a-1752-48d1-b362-a32bf9729a03", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u56db\u70b9": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
                        "\u70ed\u6d77": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
                        "\u5165\u7761": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
                        "\u65c5\u9986": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "702b015a-4e1c-446b-832c-d955fc466cdf"],
                        "\u58c1\u9f9b": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u6d77\u68e0\u82b1": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "ad23474a-1752-48d1-b362-a32bf9729a03", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u5fae\u4e0d\u8db3\u9053": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
                        "\u52b3\u987f": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
                        "\u7275\u725b\u82b1": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u76db\u653e": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u7efd\u653e": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u4e0d\u7720": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u7f8e\u6781\u4e86": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u846b\u82a6\u82b1": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u5408\u6b22\u82b1": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u591c\u6765\u9999": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
                        "\u611f\u53d7": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u6709\u9650": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u80fd\u529b": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u7f8e\u662f": ["5340234b-4008-4d8d-a8ce-f7333e132af9", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u65e0\u9650": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u7f8e\u7684": ["ca5daedc-33d8-4bcd-953c-318911bc8787", "5340234b-4008-4d8d-a8ce-f7333e132af9", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u4e00\u6735\u82b1": ["5340234b-4008-4d8d-a8ce-f7333e132af9", "0cb99c9f-d875-42f5-9cb4-22e9da9d8824", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u81ea\u7136": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
                        "\u8138\u578b": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u7c73\u5f00\u6717\u57fa\u7f57": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u5341\u4e5d\u5c81": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u8fdb\u6b65": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u4e34\u7ec8": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u5982\u613f": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u6b7b\u4ea1": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u4eab\u5e74": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u5957\u5236": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u96f7\u8bfa\u963f": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
                        "\u5149\u51ed": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
                        "\u7f8e\u672f\u4f5c\u54c1": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
                        "\u542f\u8fea": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
                        "\u9082\u9005": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
                        "\u6240\u5f97": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
                        "\u9676\u51b6": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
                        "\u5f00\u5149": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
                        "\u771f\u82b1": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u89c2\u5bdf": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u8ba4\u771f": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u4ed4\u7ec6\u89c2\u8d4f": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u60f3\u9053": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u8fd9\u753b": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u6b4c\u4eba": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u753b\u4e2d\u82b1": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
                        "\u53e4\u5f84": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u4e24\u4ef6": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u7ea6\u5c14": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u4f5c\u54c1": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u674e\u8fea": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u52d2\u8fbe": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u739b\u4f0a": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u7f57\u4e39": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u9886\u7565\u5230": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u521b\u4f5c": ["09918f90-e993-4579-9e3a-6685af252177"],
                        "\u6742\u79cd\u72d7": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u4e00\u53ea": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u6625\u8349": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u5c0f\u72d7": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u4e1c\u5012\u897f\u6b6a": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u6c34\u58a8\u753b": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u5b97\u8fbe": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u72d7\u4ea7": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u6211\u5bb6": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u5f62\u8c61": ["7f22cb08-4f65-40fa-9b38-6b5d6c81424a"],
                        "\u9ec4\u660f": ["3a827173-18f0-469c-839e-360fc12f851c"],
                        "\u6b21\u90ce": ["3a827173-18f0-469c-839e-360fc12f851c", "bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u4eac\u90fd": ["3a827173-18f0-469c-839e-360fc12f851c", "bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u4e8c\u90ce": ["3a827173-18f0-469c-839e-360fc12f851c", "bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u8336\u7897": ["3a827173-18f0-469c-839e-360fc12f851c", "bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u60f3\u8d77": ["3a827173-18f0-469c-839e-360fc12f851c"],
                        "\u5929\u8272": ["3a827173-18f0-469c-839e-360fc12f851c"],
                        "\u65e5\u672c": ["3a827173-18f0-469c-839e-360fc12f851c"],
                        "\u5929\u7a7a": ["3a827173-18f0-469c-839e-360fc12f851c"],
                        "\u540c\u957f": ["3a827173-18f0-469c-839e-360fc12f851c"],
                        "\u8fd9\u5e45": ["bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u65e5\u66ae": ["bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u5728\u6211\u5fc3\u4e2d": ["bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u66f4\u7f8e": ["bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u4e09\u8005": ["bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u547c\u5e94": ["bf24f781-4da8-4b94-b727-c6dc54e44769"],
                        "\u4eba\u5230": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u7fcc\u65e5": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u672c\u80fd\u5bfa": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u6d66\u535c\u7389\u5802": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u603b\u662f": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u7389\u5802": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u5c9a\u5c71": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u5f52\u9014": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u62dc\u8c12": ["ca5daedc-33d8-4bcd-953c-318911bc8787"],
                        "\u7f18\u6545": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
                        "\u56db\u65f6": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
                        "\u9192\u6765": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
                        "\u51cc\u6668": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
                        "\u53d1\u73b0": ["702b015a-4e1c-446b-832c-d955fc466cdf"]
                }
        }
}

因为"\u53d1\u73b0" 这种格式的字符串属于 Unicode 编码的十六进制表示形式。为更加清楚的展示上述中文内容,将其转换为中文,如下所示:

{
    "__type__": "keyword_table",
    "__data__": {
        "index_id": "d961ab69-bd75-4880-be35-d0b3396484ce",
        "summary": null,
        "table": {
            "不可思议": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
            "未眠": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "702b015a-4e1c-446b-832c-d955fc466cdf", "ad23474a-1752-48d1-b362-a32bf9729a03", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "四点": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
            "热海": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
            "入睡": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
            "旅馆": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "702b015a-4e1c-446b-832c-d955fc466cdf"],
            "壁龛": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "海椰花": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a", "ad23474a-1752-48d1-b362-a32bf9729a03", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "微不足道": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
            "劳顿": ["c36a4b3b-ec9b-45a1-aa25-bdb035611d0a"],
            "牵牛花": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "盛放": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "绽放": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "不眠": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "美极了": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "葫芦花": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "合欢花": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "夜来香": ["ad23474a-1752-48d1-b362-a32bf9729a03"],
            "感受": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "有限": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "能力": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "美是": ["5340234b-4008-4d8d-a8ce-f7333e132af9", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "无限": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "美的": ["ca5daedc-33d8-4bcd-953c-318911bc8787", "5340234b-4008-4d8d-a8ce-f7333e132af9", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "一朵花": ["5340234b-4008-4d8d-a8ce-f7333e132af9", "0cb99c9f-d875-42f5-9cb4-22e9da9d8824", "5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "自然": ["5cdbae8b-1f86-495f-b995-0866e2cc0f00"],
            "脸型": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "米开朗基罗": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "十九岁": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "进步": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "临终": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "如愿": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "死亡": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "享年": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "套制": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "雷诺阿": ["af1788d0-db9b-4e4f-b652-d4e34d379e55"],
            "光凭": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
            "美术作品": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
            "启迪": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
            "逗引": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
            "所得": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
            "陶冶": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
            "开光": ["5340234b-4008-4d8d-a8ce-f7333e132af9"],
            "真花": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "观察": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "认真": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "仔细观赏": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "想到": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "这画": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "歌人": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "画中花": ["0cb99c9f-d875-42f5-9cb4-22e9da9d8824"],
            "古径": ["09918f90-e993-4579-9e3a-6685af252177"],
            "两件": ["09918f90-e993-4579-9e3a-6685af252177"],
            "约尔": ["09918f90-e993-4579-9e3a-6685af252177"],
            "作品": ["09918f90-e993-4579-9e3a-6685af252177"],
            "李迪": ["09918f90-e993-4579-9e3a-668

5af252177"],
            "猫作": ["09918f90-e993-4579-9e3a-6685af252177"],
            "点缀": ["09918f90-e993-4579-9e3a-6685af252177"],
            "孤寂": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "朝阳": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "高悬": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "孤单": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "清泉": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "错觉": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "窗台": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "镜子": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "夜归": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "情绪": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "疲惫": ["702b015a-4e1c-446b-832c-d955fc466cdf"],
            "安静": ["702b015a-4e1c-446b-832c-d955fc466cdf"]
        }
    }
}

其中,关键词后面的编码为document_segments数据表中的index_node_id字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798731.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 框架 jedis 与 lettuce 比较

【需求背景】 由于集群模式下 Spring 对 jedis 的封装,在使用批量方法 (mget、delete) 时会把任务都提交到仅有一个核心线程的 executor 中执行,在高并发场景下会造成应用内大量任务处于排队状态而得不到执行。 具体参考:https://juejin.cn…

CTF之easyupload

拿到题目发现是文件上传的漏洞&#xff0c;但是这个黑名单过滤的有点严格&#xff0c;无论是文件里还是文件后缀都不能出现php 那我们就用<?eval($_POST[a]);?>来进行绕过&#xff08;注意这里要加个GIF89a或者GIP87a进行欺骗&#xff09; 但是后缀依然不能绕过怎么办&…

江协科技51单片机学习- p27 I2C AT24C02存储器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

【数据结构】栈和队列的深度探索,从实现到应用详解

&#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f341;1. 栈的介绍 栈是一种后进先出的数据结构&#xff0c;栈中的元素只能从栈顶进行插入和删除操作&#xff0c;类似于叠盘子&#xff0c;最后放上去的盘子最…

【题解】—— LeetCode一周小结28

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结27 8.寻找数组的中心下标 题目链接&#xff1a;724. 寻找数组的…

【CICID】GitHub-Actions-SpringBoot项目部署

[TOC] 【CICID】GitHub-Actions-SpringBoot项目部署 0 流程图 1 创建SprinBoot项目 ​ IDEA创建本地项目&#xff0c;然后推送到 Github 1.1 项目结构 1.2 Dockerfile文件 根据自身项目&#xff0c;修改 CMD ["java","-jar","/app/target/Spri…

docker部署canal 并监听mysql

1.部署mysql 需要开启mysql的binlong&#xff0c;和创建好用户等 可以参考这个 Docker部署Mysql数据库详解-CSDN博客 2.部署canal 参考这一篇&#xff1a; docker安装Canal&#xff0c;开启MySQL binlog &#xff0c;连接Java&#xff0c;监控MySQL变化_docker canal-CSD…

简单搭建卷积神经网络实现手写数字10分类

搭建卷积神经网络实现手写数字10分类 1.思路流程 1.导入minest数据集 2.对数据进行预处理 3.构建卷积神经网络模型 4.训练模型&#xff0c;评估模型 5.用模型进行训练预测 一.导入minest数据集 MNIST--->raw--->test-->(0,1,2...) 10个文件夹 MNIST--->raw-…

【Linux】基于环形队列RingQueue的生产消费者模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 环形队列的概念及定义 POSIX信号量 RingQueue的实现方式 RingQueue.hpp的构建 Thread.hpp Main.cc主函数的编写 Task.hpp function包装器的使用 总结 前言…

《Python数据科学之一:初见数据科学与环境》

《Python数据科学之一&#xff1a;初见数据科学与环境》 欢迎来到“Python数据科学”系列的第一篇文章。在这个系列中&#xff0c;我们将通过Python的镜头&#xff0c;深入探索数据科学的丰富世界。首先&#xff0c;让我们设置和理解数据科学的基本概念以及在开始任何数据科学项…

《C专家编程》 C++

抽象 就是观察一群数据&#xff0c;忽略不重要的区别&#xff0c;只记录关注的事务特征的关键数据项。比如有一群学生&#xff0c;关键数据项就是学号&#xff0c;身份证号&#xff0c;姓名等。 class student {int stu_num;int id_num;char name[10]; } 访问控制 this关键字…

安全防御:防火墙概述

目录 一、信息安全 1.1 恶意程序一般会具备一下多个或全部特点 1.2 信息安全五要素&#xff1a; 二、了解防火墙 2.1 防火墙的核心任务 2.2 防火墙的分类 2.3 防火墙的发展历程 2.3.1 包过滤防火墙 2.3.2 应用代理防火墙 2.3.3 状态检测防火墙 补充防御设备 三、防…

Torch-Pruning 库入门级使用介绍

项目地址&#xff1a;https://github.com/VainF/Torch-Pruning Torch-Pruning 是一个专用于torch的模型剪枝库&#xff0c;其基于DepGraph 技术分析出模型layer中的依赖关系。DepGraph 与现有的修剪方法&#xff08;如 Magnitude Pruning 或 Taylor Pruning&#xff09;相结合…

uniapp实现水印相机

uniapp实现水印相机-livePusher 水印相机 背景 前两天拿到了一个需求&#xff0c;要求在内部的oaApp中增加一个卫生检查模块&#xff0c;这个模块中的核心诉求就是要求拍照的照片添加水印。对于这个需求&#xff0c;我首先想到的是直接去插件市场&#xff0c;下一个水印相机…

《Python数据科学之五:模型评估与调优深入解析》

《Python数据科学之五&#xff1a;模型评估与调优深入解析》 在数据科学项目中&#xff0c;精确的模型评估和细致的调优过程是确保模型质量、提高预测准确性的关键步骤。本文将详细探讨如何利用 Python 及其强大的库进行模型评估和调优&#xff0c;确保您的模型能够达到最佳性能…

docker中1个nginx容器搭配多个django项目中设置uwsgi.ini的django项目路径

docker中&#xff0c;1个nginx容器搭配多个django项目容器&#xff0c;设置各个uwsgi.ini的django项目路径 被这个卡了一下&#xff0c;真是&#xff0c;哎 各个uwsgi配置应该怎样设置项目路径 django项目1中创建的django项目名为 web 那么uwsgi.ini中要设置为 chdir …

【Vue3 ts】echars图表展示统计的月份数据

图片展示 此处内容为展示24年各个月份产品的创建数量。在后端统计24年各个月份产品数量后&#xff0c;以数组的格式发送给前端&#xff0c;前端负责展示。 后端 entity层&#xff1a; Data Schema(description "月份统计")public class MonthCount {private Stri…

得物六宫格验证码分析

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

算法的时间复杂度和空间复杂度-例题

一、消失的数字 . - 力扣&#xff08;LeetCode&#xff09; 本题要求的时间复杂度是O(n) &#xff0c;所以我们不能用循环嵌套&#xff1b; 解法一&#xff1a; int missingNumber(int* nums, int numsSize){int sum10;for(int i0;i<numsSize;i){sum1i;}int sum20;for(i…