本文主要介绍Dify中Jieba类的create()方法执行过程,重点是段(segment)的关键词的生成。
一.create方法流程概述
整个create
方法的目的是为了处理一批文本,提取它们的关键词,并更新关键词表,以便于后续的关键词搜索和索引。这个过程通过获取锁来保证数据的一致性和操作的原子性。
该create
方法是Jieba
类的一部分,用于处理文本列表,提取关键词,并更新关键词表。以下是该方法的详细解释:
1.初始化和锁定
方法首先构建一个锁名称,基于数据集的ID
。然后,使用redis_client.lock
获取一个锁,确保在关键词索引过程中,同一时间只有一个进程可以执行这个操作。锁的超时时间设置为600秒。
2.关键词表处理器
创建一个JiebaKeywordTableHandler
实例,用于后续的关键词提取。
3.获取数据集关键词表
调用_get_dataset_keyword_table
方法获取当前数据集的关键词表。如果关键词表不存在,则会创建一个新的。
4.遍历文本并提取关键词
对于传入的文本列表中的每个文本,使用JiebaKeywordTableHandler
的extract_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_id
和 node_id
从 DocumentSegment
表中查询对应的文档段实例。
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
字段。