如何依据spacy工具包实现对中文文本构建邻接矩阵

目录

问题描述:

 代码实现:


问题描述:

不同于使用spacy构建英文的邻接矩阵,英文是以空格划分单词的, 所以使用spacy进行依存关系分析的时候,得到的是单个英文单词与另外的单个英文单词之间的关系。

spacy工具包在对中文进行依存关系解析的时候,是先对中文进行了分词,再进行的解析。在构建邻接矩阵的时候,如果以依存关系解析的单位来构建的话,如下图,会行程一个5*5的矩阵。使用Bert对该句进行分词的时候,得到的是单一的单词,这样会造成维度不一致的问题,因为我们需要将spacy解析的结果进行预处理

如何依据spacy工具包实现对中文文本构建邻接矩阵_第1张图片

 代码实现:

实现思想,如果出现“比”--“骑车”这样的情况,我们则构造邻接矩阵的时候,是1*2(即2X3和2X4位置都是1),注意,邻接矩阵要考虑无向图。

import spacy

from transformers import BertTokenizerFast
import numpy as np
from pdb import set_trace as stop

tokenizer = BertTokenizerFast.from_pretrained("/home/qtxu/PLM/bert-base-chinese")
text = "油耗比骑车要高。"
sen_tokens = tokenizer(text, add_special_tokens=False)
sen_tokens_input_ids = sen_tokens['input_ids']
sen_tokens_text_list = tokenizer.decode(sen_tokens['input_ids']).split(" ")

nlp = spacy.load("zh_core_web_sm") # 加载spaCy模型
doc = nlp(text) # 解析文本

spacy_tokens = []
for token in doc:
    spacy_tokens.append(token) # ['油耗', '比', '骑车', '要', '高', '。']
# print(spacy_tokens)

# 依据spacy的分词解析结果,存放开始的index
test_dict = {}
for word in spacy_tokens:
    index = text.index(str(word))
    test_dict[index] = word

# print(test_dict) # {0: '油耗', 2: '比', 3: '骑车', 5: '要', 6: '高', 7: '。'}

count = 0
adj_matrix = np.eye(len(sen_tokens_text_list))
i = 0
while i < len(sen_tokens_text_list):
    word = spacy_tokens[count]
    word_sp = list(word.text)
    for child in word.children:
        adj_word_list = list(child.text) # 具有依存关系的词语
        word_list = list(word.text) # spacy分词的结果中的某一个词
        child_key = next(key for key, val in test_dict.items() if val == child) # obtain the start index of child
        word_key = next(key for key, val in test_dict.items() if val == word) # obtain the start index of spacy_word
        print("child:{}, word:{}".format(child, word))
        for m in range(child_key, len(adj_word_list) + child_key):
            for n in range(word_key, len(word_list) + word_key):
                print("m:{}, n:{}".format(m,n))
                adj_matrix[m][n] = 1 #无向图
                adj_matrix[n][m] = 1
                
    i += len(word_sp)
    count += 1

print(adj_matrix)

你可能感兴趣的:(程序,算法,c++,开发语言)