1.提取:最初,从 Form 10-K 报告中提取相关信息,这是上市公司向证券交易委员会(SEC)提交的一份全面年度报告。这些数据被解析并结构化为可管理的块,这些块作为知识图谱中的节点。
1.增强:在提取后,数据经过增强以丰富其价值。为每个块添加嵌入,为信息提供额外的上下文和深度。这一步对于使图形更加健壮并能够产生更丰富的见解至关重要。
1.扩展:一旦数据得到增强,图就准备好扩展了。这涉及将节点连接到彼此,以扩展图内的上下文和关系。通过在 Form 10-K 报告中建立信息片段之间的关系,图变得更加复杂,并更好地表示数据的相互关系。
1.迭代细化:提取、增强和扩展的过程可以根据需要重复进行,纳入额外的 Form 10-K 报告、外部数据源和用户反馈,持续细化和改进图的相关性和准确性。这种迭代方法确保了知识图谱随着时间的推移而发展,以纳入新信息并满足不断变化的分析需求。
1.视觉分析:在最后阶段,可以向图添加地址节点,实现对 Form 10-K 报告的空间关系进行视觉分析和探索。这允许回答更多问题,例如识别彼此相邻的公司或分析投资公司相对于它们投资的公司的地理分布。由此产生的知
识图谱为公司披露和财务报告的各个方面提供了宝贵的见解。
通过遵循这种结构化方法,并从 Form 10-K 报告中纳入相关数据,创建一个全面且动态的知识图谱是可行的。这样的图谱不仅有助于深入了解公司披露,还能在各个领域支持知情决策。
让我们详细说明如何使用《吠陀·歌》数字副本,这是一部著名的精神文本,创建一个基本的知识图谱。这部文本是由斯里·斯瓦米·西瓦南达编写的,充满了丰富的信息,我们可以利用知识图谱进行组织。我们将使用 Neo4j,它帮助我们管理和结构化我们的图形,以及 Langchain,它帮助我们处理文本。
首先,使用 Neo4j 创建一个免费帐户。对于本例,我们将使用免费层,允许创建一个实例。
凭证文件将包含以下细节,您将需要在随后的代码中使用这些细节:
#在使用这些详细信息进行连接之前等待60秒,或登录https://console.neo4j.io验证Aura实例是否可用
NEO4J_URI=值
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=值
AURA_INSTANCEID=值
AURA_INSTANCENAME=Instance01现在让我们创建知识图谱。
1.安装库
fromdotenvimportload_dotenv
importos
#常见的数据处理
importtextwrap
#Langchain
fromlangchain_community.graphsimportNeo4jGraph
fromlangchain_community.vectorstoresimportNeo4jVector
fromlangchain.text_splitterimportRecursiveCharacterTextSplitter
fromlangchain.chainsimportRetrievalQAWithSourcesChain
fromlangchain.llmsimportOpenAI
fromlangchain.embeddingsimportOpenAIEmbeddings
fromlangchain.document_loadersimportPyPDFLoader1. _从 PDF 中提取文本_:第一步是加载 PDF 文件并将其页面拆分为可管理的文本块。我们利用 langchain 库中的 PyPDFLoader 模块来完成这项任务。
#加载PDF文件
loader=PyPDFLoader("您的/pdf/文件路径.pdf")
pages=loader.load_and_split()1. _将文本拆分为块_:接下来,我们将提取的文本拆分为更小的块,以便进一步处理。我们使用 langchain 中的 RecursiveCharacterTextSplitter 类来实现此目的。
#将页面拆分为块
text_splitter=RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=0)
chunks=text_splitter.split_documents(pages)1. _创建向量存储,生成嵌入并存储在 Neo4j 中_:我们创建一个 Neo4jVector 对象,将文本块的嵌入存储在 Neo4j 图数据库中。这使我们能够以后有效地检索和操作嵌入。
#警告控制
importwarnings
warnings.filterwarnings("ignore")
#从凭证文件中加载环境变量
load_dotenv('.env',override=True)
NEO4J_URI=os.getenv('NEO4J_URI')
NEO4J_USERNAME=os.getenv('NEO4J_USERNAME')
NEO4J_PASSWORD=os.getenv('NEO4J_PASSWORD')
NEO4J_DATABASE=os.getenv('NEO4J_DATABASE')or'neo4j'
NEO4J_DATABASE='neo4j'
#全局常量
VECTOR_INDEX_NAME='pdf_chunks'
VECTOR_NODE_LABEL='Chunk'
VECTOR_SOURCE_PROPERTY='text'
VECTOR_EMBEDDING_PROPERTY='textEmbedding'
kg=Neo4jGraph(
url=NEO4J_URI,username=NEO4J_USERNAME,password=NEO4J_PASSWORD,database=NEO4J_DATABASE
)#创建Neo4j向量存储
neo4j_vector_store=Neo4jVector.from_documents(
embedding=OpenAIEmbeddings(),
documents=chunks,
url=NEO4J_URI,
username=NEO4J_USERNAME,
password=NEO4J_PASSWORD,
index_name=VECTOR_INDEX_NAME,
text_node_property=VECTOR_SOURCE_PROPERTY,
embedding_node_property=VECTOR_EMBEDDING_PROPERTY,
)1. _构建关系_:我们在图中建立文本块之间的关系,指示它们的顺序和与父 PDF 文档的关联。
#创建一个PDF节点
cypher="""
MERGE(p
DF{name
pdfName})
RETURNp
"""
kg.query(cypher,params={'pdfName':"您的/pdf/文件路径.pdf"})
#使用PART_OF关系将块连接到其父PDF
cypher="""
MATCH(c:Chunk),(p
DF)
WHEREp.name=$pdfName
MERGE(c)-[newRelationship
ART_OF]->(p)
RETURNcount(newRelationship)
"""
kg.query(cypher,params={'pdfName':"您的/pdf/文件路径.pdf"})
#在后续块之间创建NEXT关系
cypher="""
MATCH(c1:Chunk),(c2:Chunk)
WHEREc1.chunkSeqId=c2.chunkSeqId-1
MERGE(c1)-[r:NEXT]->(c2)
RETURNcount(r)
"""
kg.query(cypher)1. _问答_:最后,我们可以利用构建的知识图谱执行问答任务。我们从向量存储创建一个检索器,并从 PDF 文档的内容基于问题回答链创建一个聊天问答链。
#从向量存储创建一个检
索器
retriever=neo4j_vector_store.as_retriever()
#从检索器创建一个聊天问答链
chain=RetrievalQAWithSourcesChain.from_chain_type(
OpenAI(temperature=0),
chain_type="stuff",
retriever=retriever
)
#提出一个问题
question="这份 PDF 文档的主题是什么?"
answer=chain(
{"question":question},
return_only_outputs=True,
)
print(textwrap.fill(answer["answer"]))以下是检查 Neo4j 中数据的一些查询
节点计数
#返回节点计数
kg.query("""
MATCH(n)
RETURNcount(n)asnodeCount
""")打印模式
kg.refresh_schema()
print(kg.schema)显示索引
kg.query("SHOWINDEXES")样本输出
Neo4j 仪表板
Q&A 输出
使用知识图谱以及像 Neo4j 和 Langchain 这样的工具,我们可以将复杂的、非结构化的文本转换为易于分析的结构化、相互连接的数据。这个过程可以应用于各种类型的信息,从财务报告到精神文本。这个示例是创建知识图谱的基本说明。随着我们继续探索和发展这项技术,我们可以发现理解和解释数据的新方法。
LM Studio 的 Python 演示:创造性地编写代码
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |