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字段。

相关推荐

  1. Qt:实现gitdiff功能

    2024-07-15 05:12:03       34 阅读
  2. 报告pg_jiebabug

    2024-07-15 05:12:03       50 阅读
  3. Golang实现类似与继承方法

    2024-07-15 05:12:03       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 05:12:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 05:12:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 05:12:03       58 阅读
  4. Python语言-面向对象

    2024-07-15 05:12:03       69 阅读

热门阅读

  1. C# Winform之propertyGrid控件使用详解和分组设置

    2024-07-15 05:12:03       27 阅读
  2. ComfyUl提示词技巧

    2024-07-15 05:12:03       30 阅读
  3. 基于智能算法的品牌视觉识别系统优化研究

    2024-07-15 05:12:03       23 阅读
  4. Windows图形界面(GUI)-DLG-C/C++ - 图形界面程序结构

    2024-07-15 05:12:03       29 阅读
  5. 自学黑客

    2024-07-15 05:12:03       21 阅读
  6. 归并排序(递归实现)

    2024-07-15 05:12:03       25 阅读
  7. SpinalHDL之VHDL 和 Verilog 生成

    2024-07-15 05:12:03       25 阅读
  8. 等保测评助力网络安全治理现代化

    2024-07-15 05:12:03       20 阅读
  9. 去中心化预言机是什么

    2024-07-15 05:12:03       32 阅读
  10. Electron 进程间通信

    2024-07-15 05:12:03       26 阅读