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

news2024/12/22 19:48:15

本文主要介绍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字段。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark 实现自定义加密

文章目录 Spark 实现自定义加密一、建立加密和解密的自定义函数二、在 Spark 环境下导入对象实现的方法,并在 SparkSession 中注册 UDF 函数三、在SparkSQL中调用函数 Spark 实现自定义加密 一、建立加密和解密的自定义函数 import java.nio.charset.{StandardCha…

STM32+三色LED智能调光系统源程序 易安卓APP 原理图

资料下载地址:STM32三色LED智能调光系统源程序 易安卓APP 原理图 三色LED手机智能调光系统概述: 利用开发的智能手机软件,对照明三色LED进行智能调光。包含的功能有,支持多手机同时连接服务端,互动调光。支持关…

【数据结构】顺序表的应用

目录 一.引言 二.顺序表概念 三.顺序表的实现 1.定义顺序表 2.顺序表初始化 ​编辑 3.检查空间,如果满了,进行增容 4.顺序表尾插 5.顺序表尾删 6.顺序表头插 7.顺序表头删 ​编辑 8.顺序表查找 9.顺序表在pos位置插入x 10.顺序表删…

深入探讨:CPU问题的深度分析与调优

引言 你是否曾经遇到过这样的情况:系统运行突然变慢,用户抱怨不断,检查后发现CPU使用率居高不下?这时候,你会如何解决?本文将详细解析CPU问题的分析与调优方法,帮助你在面对类似问题时游刃有余。 案例分析:一次CPU性能瓶颈的解决过程 某知名互联网公司在一次促销活动…

Dubbo基础知识

1、什么是 Dubbo ? Dubbo是基于Java的高性能轻量级的RPC分布式服务框架,致力于提供透明化的RPC远程服务调用方案,以及SOA服务治理方案。现已成为Apache 基金会孵化项目。 2、为什么要使用Dubbo? 背景: 随着互联网的快速发展,Web应…

JAVA毕业设计147—基于Java+Springboot的手机维修管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringboot的手机维修管理系统(源代码数据库)147 一、系统介绍 本项目分为用户、管理员、维修员三种角色 1、用户: 注册、登录、新闻公告、售后申请、申请列…

使用Samba或NFS实现文件共享

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、SAMBA文件共享服务 1987年,微软公司和英特尔公司共同定制了SMB(Server Messages Block)服务器消息块协议&am…

板级调试小助手(2)ZYNQ自定义IP核构建属于自己的DDS外设

一、前言 在上期文章中讲述了小助手的系统结构和原理。在PYNQ的框架开发中,我们一般可以将PL端当做PS端的一个外设,通过读写寄存器的方式来操作外设的功能,就类似于在开发ARM和DSP中操作外设一样,不同时的是,我们可以通…

关于前端数据库可视化库的选择,vue3+antd+g2plot录课计划

之前:antdv 现在:g2plot https://g2plot.antv.antgroup.com/manual/introduction 录课内容:快速入门 图表示例: 选择使用比较广泛的示例类型,录课顺序如下: 1、折线图2、面积图3、柱形图4、条形图5、饼…

[Qt] Qt Creator中,新建QT文件时选择界面模版下的各选项

在Qt Creator中,新建文件时选择界面模版下的各选项具有特定的意义,这些选项主要帮助开发者根据项目需求快速生成不同类型的文件。以下是对这些选项的详细解释: 0. Qt Item Model 意义:列表模型是Qt中用于表示和操作数据的强大抽…

Ubuntu下载安装chrome浏览器

方法一:wget下载并安装 1、创建文件夹存安装包 cd /root/Downloads mkdir chrome 2、下载安装包到文件夹内 wget -c https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -P /root/Downloads/chrome 3、安装 cd chrome sudo dpkg -i go…

从0开始的STM32HAL库学习5

旋转编码计数器 修改中断代码 void EXTI0_IRQHandler(void) {/* USER CODE BEGIN EXTI0_IRQn 0 */if(__HAL_GPIO_EXTI_GET_FLAG(PB0_Pin)){if(HAL_GPIO_ReadPin(PB1_GPIO_Port, PB1_Pin)GPIO_PIN_RESET){count--;}/* USER CODE END EXTI0_IRQn 0 */HAL_GPIO_EXTI_IRQHandler…

【论文极速读】 可微分检索索引(Differential Search Index, DSI)

【论文极速读】 可微分检索索引(Differential Search Index, DSI) FesianXu 20240714 at WeChat Search Team 前言 最近从朋友处得知了DSI这个概念,所谓的可微分检索索引DSI,就是通过语言模型将检索过程中的索引和召回…

virtualbox的ubuntu默认ipv4地址为10.0.2.15的修改以及xshell和xftp的连接

virtualbox安装Ubuntu后,默认的地址为10.0.2.15 我们查看virtualbox的设置发现是NAT 学过计算机网络的应该了解NAT技术,为了安全以及缓解ip使用,我们留了部分私有ip地址。 私有IP地址网段如下: A类:1个A类网段&…

持续学习的综述: 理论、方法与应用(三:泛化分析)

前文连接:持续学习的综述: 理论、方法与应用(一) 前文连接:持续学习的综述: 理论、方法与应用(二:理论基础) 泛化分析 目前持续学习的理论研究主要是在增量任务的训练集上进行的,假…

Java面试题:MVCC

MVCC 保证事务的隔离性 排它锁: 一个事务获取了数据行的排他锁,其他事务就不能再获取该行的其他锁 MVCC: 多版本并发控制 维护一个数据的多个版本,使读写不存在冲突 具体实现依靠 隐藏字段 mysql中隐藏了三个隐藏字段 db_trx_id:最近修改事务 db_roll_ptr:指向上一个…

【Linux】Linux必备的基础指令

目录 Linux必备的基础指令一 、 什么是Linux二、 Linux常用命令2.1 ls2.2 pwd2.3 cd2.4 touch2.5 cat2.6 mkdir2.7 rm 三、 Linux重要指令3.1 cp3.2 mv3.3 tail3.4 vim3.5 grep3.6 ps3.7 netstat Linux必备的基础指令 一 、 什么是Linux 系统编程&⽹络编程 Linux⾃⾝提供…

适合创业公司使用的wordpress主题

对于创业公司来说,‌选择一个适合的WordPress主题至关重要,‌它不仅能够提升公司网站的外观和用户体验,‌还能帮助优化搜索引擎排名,‌从而吸引更多的潜在客户。‌以下是一些推荐的WordPress主题,‌特别适合创业公司使…

【vue3-命名规范以及注意事项】

使用多字组件名 使用详细的道具定义props 在提交的代码中,prop定义应该总是尽可能详细,至少指定类型。 在声明期间,道具名应该始终使用camelCase。当在in-DOM模板中使用时,props应该是串式的。单文件组件模板和JSX可以使用keba…

【leetcode】整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 示例 1: …