neo4j图形数据库入门

在对文本的数据进行充分的理解的基础上,需要对处理结果进行保存,由于主要工作是建立知识图谱,可以考虑使用图形数据库进行存储,使用neo数据库
基本的应用语法

  1. from py2neo import Graph, Node, Relationship
  2. ##连接neo4j数据库,输入地址、用户名、密码
  3. graph = Graph('http://localhost:7474/browser/', username='neo4j', password='neo4j')
  4. tx = graph.begin()
  5. a = Node("人物", name=x.word)
  6. tx.create(a)
  7. tx.commit()

上述的代码可以实现创立节点并提交到数据库
image.png

自然语言处理模块结合

随后开始考虑怎么和自然语言处理模块进行结合
最后实现了下述代码

  1. import jieba
  2. import jieba.analyse
  3. import jieba.posseg
  4. from py2neo import Graph, Node, Relationship
  5. novel = open('D:\\New_desktop\\1.txt','r',encoding='UTF-8')
  6. content=novel.read()
  7. novel_segmented = open('D:\\New_desktop\\2.txt','w')
  8. cutword = jieba.cut(content,cut_all=False)
  9. seg = ' '.join(cutword).replace(',','').replace('。','').replace('“','').replace('”','').replace(':','').replace('…','')\
  10. .replace('!','').replace('?','').replace('~','').replace('(','').replace(')','').replace('、','').replace(';','')
  11. try:
  12. with open('D:\\New_desktop\\2.txt', 'w+', encoding='utf-8') as f:
  13. f.write(seg)
  14. except FileNotFoundError:
  15. print('无法打开指定的文件!')
  16. except LookupError:
  17. print('指定了未知的编码!')
  18. except UnicodeDecodeError:
  19. print('读取文件时解码错误!')
  20. novel.close()
  21. novel_segmented.close()
  22. # 训练word2vec模型,生成词向量
  23. from gensim.models import word2vec
  24. # 训练word2vec模型,生成词向量
  25. s = word2vec.LineSentence('D:\\New_desktop\\2.txt')
  26. # 这里如果报编码错误,notepad++打开,然后转码为对应编码即可。
  27. model = word2vec.Word2Vec(s,size=200,window=5,min_count=0,workers=4)
  28. model.save('D:\\New_desktop\\3.txt')
  29. print("model caculate over")
  30. ##连接neo4j数据库,输入地址、用户名、密码
  31. graph = Graph('http://localhost:7474/browser/', username='neo4j', password='20010413ssjssj*')
  32. tx = graph.begin()
  33. print("graph establish over")
  34. filename = "D:\\New_desktop\\1.txt"
  35. fa = open(filename,"r",encoding='utf-8')
  36. result = list()
  37. for line in fa.readlines():
  38. line = line.strip()
  39. if not len(line):
  40. continue
  41. result.append(line)
  42. fa.close
  43. content=""
  44. for sentence in result:
  45. sentence.encode('utf-8')
  46. data=sentence.strip()
  47. if len(data)!=0:
  48. content+=data
  49. cutword = jieba.cut(content,cut_all=False)
  50. seg = ''.join(cutword).replace(',','').replace('。','').replace('“','').replace('”','').replace(':','').replace('…','')\
  51. .replace('!','').replace('?','').replace('~','').replace('(','').replace(')','').replace('、','').replace(';','').replace(',','')
  52. sentence_seged = jieba.posseg.cut(seg.strip())
  53. print("divide word over")
  54. outstr = ''
  55. for x in sentence_seged:
  56. #outstr += "{}/{},".format(x.word, x.flag)
  57. # 上面的for循环可以用python递推式构造生成器完成
  58. # outstr = ",".join([("%s/%s" %(x.word,x.flag)) for x in sentence_seged])
  59. if x.flag == 'n':
  60. try:
  61. similar=model.wv.similarity("叶修",x.word)
  62. if similar>0.48:
  63. a = Node("人物", name=x.word)
  64. print(x.word)
  65. tx.create(a)
  66. except KeyError:
  67. print("not in vocabulary")
  68. print(x.word)
  69. tx.commit()

这个代码是对文本进行分词解析,解析出词性,然后利用词向量进行分析。
作为小说的一名读者,我有“叶修是人”的先验知识,结合上一篇笔记对词向量的解析使用中,和叶修相似度高的都是人,所以考虑使用“叶修”作为分类数据,对所有的名词进行计算,对相似度高于一定阈值的认为是人,然后保存进数据库,进而实现出抽取出文本中人物实体的目的
image.png
显然在算法和代码上出了问题,只提取到了陈果和大家两个实体,而且没有加入查重的功能,还有待改进

总结

报错
  1. 报错有关于词向量的,词向量报错词不存在:解决,这个就是理解为jieba分词的局限性,在第一次分词的结果和词向量解析结果不同,如jieba分出了“时叶秋”这个词,并不在词向量的词库里,就出现了报错,最后使用代码里的try catch的方式来捕获异常。更好的一个解决方案就是改进分词算法,使得分词更加的精确
  2. 报错里有数据库提交不合法的,经过排查,初步认为应该是重复提交的问题,我似乎一下子提交了两个一样的变量就引发了异常(但是明明相同的节点是可以存在的)
  3. 在查重和分词计算上还可以大幅提高