【NLP】10其它词、句向量生成方法——腾讯AI实验室汉字词句嵌入语料库与gensim Doc2Vec

1. 腾讯AI实验室汉字词句嵌入语料库

网站:

  1. 自然语言处理(NLP)研究
  2. 腾讯AI实验室汉字词句嵌入语料库,语料库为200万个矢量词表示,也就是嵌入,可表示超过800万个中文单词和短语,这些单词和短语已预先训练超过300亿个单词

下载后得到名为’Tencent_AILab_ChineseEmbedding.tar.gz’的文件

运行程序报错:

MemoryError: Unable to allocate 6.57 GiB for an array with shape (8824330, 200) and data type float32
from gensim.models import KeyedVectors

# file = '... your path\\Tencent_AILab_ChineseEmbedding.txt'
# wv_from_text = KeyedVectors.load_word2vec_format(file, binary=False)
# wv_from_text.save('... your path\\Tencent_AILab_ChineseEmbedding.model')
wv_from_text = KeyedVectors.load('... your path\\Tencent_AILab_ChineseEmbedding.model')

print(wv_from_text.vector_size)
print(wv_from_text.most_similar('清华大学'))
print(wv_from_text.most_similar('狗'))
print(wv_from_text.most_similar('爱因斯坦'))
print(wv_from_text.most_similar('加拿大'))

result = wv_from_text.most_similar(positive=['woman', 'king'], negative=['man'])
most_similar_key, similarity = result[0]       # 查看最匹配的结果
print(f'{most_similar_key}:{similarity:4f}')

结果:

200
[('北京大学', 0.9299417734146118), ('清华', 0.86376953125), ('北大', 0.8397154808044434), ('南开大学', 0.7824654579162598), ('中国科学院大学', 0.780572772026062), ('中国人民大学', 0.7798628807067871), ('北京航空航天大学', 0.7776415348052979), ('浙江大学', 0.7772724628448486), ('北京科技大学', 0.7731569409370422), ('北京理工大学', 0.7729495763778687)]
[('狗的', 0.8796883225440979), ('狗是', 0.8355772495269775), ('大狗', 0.8132094144821167), ('是狗', 0.8062852621078491), ('小狗', 0.8016520738601685), ('狗子', 0.8007372617721558), ('一只狗', 0.7993444800376892), ('狗啊', 0.7963887453079224), ('宠物狗', 0.7962790727615356), ('黑狗', 0.7897279858589172)]
[('阿尔伯特·爱因斯坦', 0.8654265403747559), ('物理学家爱因斯坦', 0.8525614738464355), ('科学家爱因斯坦', 0.8433154821395874), ('物理学家', 0.8403353095054626), ('牛顿', 0.8302492499351501), ('玻尔', 0.8176203966140747), ('广义相对论', 0.8163576126098633), ('牛顿和爱因斯坦', 0.8157273530960083), ('爱恩斯坦', 0.8147901296615601), ('相对论', 0.8145008087158203)]
[('加拿大和美国', 0.8684861660003662), ('新西兰', 0.8491337299346924), ('澳大利亚', 0.8351637125015259), ('美国加拿大', 0.8211830854415894), ('澳洲', 0.8192761540412903), ('美国和加拿大', 0.8055787086486816), ('温哥华', 0.7986966371536255), ('如加拿大', 0.7906930446624756), ('加拿大和澳大利亚', 0.7904530763626099), ('美国和澳大利亚', 0.7899761199951172)]
three:0.710063

可以和这篇Blog这篇Blog对比一下

关于中文相似词表240和297的相关性度量:

((0.618136884104513, 1.394774688030693e-26), SpearmanrResult(correlation=0.5739237840901759, pvalue=2.445914679264614e-22), 0.4166666666666667)
((0.6577071920091273, 1.8685067817429436e-35), SpearmanrResult(correlation=0.6526769296294592, pvalue=9.108731037143492e-35), 7.4074074074074066)
  • 论文对wordsim-240的Spearman correlation分别为57.81、51.92,之前模型对wordsim-240的⍴为53.52,腾讯AI实验室汉字词句嵌入语料库⍴为57.39
  • 论文对wordsim-296的相关性分别为61.29、59.84,之前模型对wordsim-296的⍴为61.28,腾讯AI实验室汉字词句嵌入语料库⍴为65.27

关于中文类比词表:

(0.7943336831059811, [{'section': 'capital-common-countries', 'correct': [('雅典', '希腊', '曼谷', '泰国'),, ('东京', '日本', '德黑兰', '伊朗')], 'incorrect': [('雅典', '希腊', '巴格达', '伊拉克'), ('雅典', '希腊', '北京', '中国'), ('雅典', '希腊', '伦敦', '英国'), ('雅典', '希腊', '罗马', '意大利'), ('雅典', '希腊', '斯德哥尔摩', '瑞典'), ('巴格达', '伊拉克', '北京', '中国'), ('巴格达', '伊拉克', '开罗', '埃及'), ('巴格达', '伊拉克', '罗马', '意大利'), ('曼谷', '泰国', '北京', '中国'), ('曼谷', '泰国', '赫尔辛基', '芬兰'), ('曼谷', '泰国', '罗马', '意大利'), ('曼谷', '泰国', '斯德哥尔摩', '瑞典'), ('北京', '中国', '堪培拉', '澳大利亚'), ('北京', '中国', '罗马', '意大利'), ('柏林', '德国', '奥斯陆', '挪威'), ('柏林', '德国', '罗马', '意大利'), ('柏林', '德国', '北京', '中国'), ('伯尔尼', '瑞士', '赫尔辛基', '芬兰'), ('伯尔尼', '瑞士', '奥斯陆', '挪威'), ('伯尔尼', '瑞士', '罗马', '意大利'), ('伯尔尼', '瑞士', '北京', '中国'), ('开罗', '埃及', '赫尔辛基', '芬兰'), ('开罗', '埃及', '渥太华', '加拿大'), ('开罗', '埃及', '罗马', '意大利'), ('开罗', '埃及', '斯德哥尔摩', '瑞典'), ('开罗', '埃及', '北京', '中国'), ('堪培拉', '澳大利亚', '赫尔辛基', '芬兰'), ('堪培拉', '澳大利亚', '伊斯兰堡', '巴基斯坦'), ('堪培拉', '澳大利亚', '伦敦', '英国'), ('堪培拉', '澳大利亚', '莫斯科', '俄罗斯'), ('堪培拉', '澳大利亚', '罗马', '意大利'), ('堪培拉', '澳大利亚', '斯德哥尔摩', '瑞典'), ('堪培拉', '澳大利亚', '北京', '中国'), ('河内', '越南', '罗马', '意大利'), ('河内', '越南', '斯德哥尔摩', '瑞典'), ('河内', '越南', '北京', '中国'), ('哈瓦那', '古巴', '罗马', '意大利'), ('哈瓦那', '古巴', '斯德哥尔摩', '瑞典'), ('哈瓦那', '古巴', '北京', '中国'), ('哈瓦那', '古巴', '柏林', '德国'), ('哈瓦那', '古巴', '河内', '越南'), ('赫尔辛基', '芬兰', '罗马', '意大利'), ('赫尔辛基', '芬兰', '德黑兰', '伊朗'), ('赫尔辛基', '芬兰', '巴格达', '伊拉克'), ('赫尔辛基', '芬兰', '北京', '中国'), ('赫尔辛基', '芬兰', '伯尔尼', '瑞士'), ('伊斯兰堡', '巴基斯坦', '罗马', '意大利'), ('伊斯兰堡', '巴基斯坦', '北京', '中国'), ('伊斯兰堡', '巴基斯坦', '伯尔尼', '瑞士'), ('喀布尔', '阿富汗', '罗马', '意大利'), ('喀布尔', '阿富汗', '斯德哥尔摩', '瑞典'), ('喀布尔', '阿富汗', '开罗', '埃及'), ('伦敦', '英国', '罗马', '意大利'), ('伦敦', '英国', '雅典', '希腊'), ('伦敦', '英国', '巴格达', '伊拉克'), ('伦敦', '英国', '伯尔尼', '瑞士'), ('伦敦', '英国', '堪培拉', '澳大利亚'), ('马德里', '西班牙', '罗马', '意大利'), ('马德里', '西班牙', '北京', '中国'), ('莫斯科', '俄罗斯', '罗马', '意大利'), ('莫斯科', '俄罗斯', '斯德哥尔摩', '瑞典'), ('莫斯科', '俄罗斯', '开罗', '埃及'), ('莫斯科', '俄罗斯', '堪培拉', '澳大利亚'), ('奥斯陆', '挪威', '罗马', '意大利'), ('奥斯陆', '挪威', '北京', '中国'), ('渥太华', '加拿大', '北京', '中国'), ('巴黎', '法国', '罗马', '意大利'), ('巴黎', '法国', '巴格达', '伊拉克'), ('巴黎', '法国', '北京', '中国'), ('巴黎', '法国', '伯尔尼', '瑞士'), ('巴黎', '法国', '开罗', '埃及'), ('罗马', '意大利', '斯德哥尔摩', '瑞典'), ('罗马', '意大利', '东京', '日本'), ('罗马', '意大利', '曼谷', '泰国'), ('罗马', '意大利', '北京', '中国'), ('罗马', '意大利', '开罗', '埃及'), ('罗马', '意大利', '堪培拉', '澳大利亚'), ('罗马', '意大利', '伦敦', '英国'), ('斯德哥尔摩', '瑞典', '北京', '中国'), ('斯德哥尔摩', '瑞典', '罗马', '意大利'), ('德黑兰', '伊朗', '北京', '中国'), ('德黑兰', '伊朗', '罗马', '意大利'), ('东京', '日本', '伯尔尼', '瑞士'), ('东京', '日本', '罗马', '意大利')]}, {'section': 'city-in-state', 'correct': [('石家庄', '河北', '南昌', '江西'), ..., ('乌鲁木齐', '新疆', '南宁', '广西')], 'incorrect': [('沈阳', '辽宁', '哈尔滨', '黑龙江'), ('沈阳', '辽宁', '贵阳', '贵州'), ('沈阳', '辽宁', '南宁', '广西'), ('沈阳', '辽宁', '银川', '宁夏'), ('长春', '吉林', '石家庄', '河北'), ('长春', '吉林', '合肥', '安徽'), ('长春', '吉林', '南昌', '江西'), ('长春', '吉林', '贵阳', '贵州'), ('哈尔滨', '黑龙江', '南京', '江苏'), ('合肥', '安徽', '太原', '山西'), ('合肥', '安徽', '沈阳', '辽宁'), ('合肥', '安徽', '长春', '吉林'), ('福州', '福建', '石家庄', '河北'), ('南昌', '江西', '长春', '吉林'), ('南昌', '江西', '福州', '福建'), ('郑州', '河南', '长春', '吉林'), ('郑州', '河南', '福州', '福建'), ('武汉', '湖北', '沈阳', '辽宁'), ('广州', '广东', '石家庄', '河北'), ('海口', '海南', '南京', '江苏'), ('贵阳', '贵州', '太原', '山西'), ('昆明', '云南', '长春', '吉林'), ('昆明', '云南', '乌鲁木齐', '新疆'), ('拉萨', '西藏', '福州', '福建'), ('南宁', '广西', '福州', '福建'), ('呼和浩特', '内蒙古', '太原', '山西'), ('银川', '宁夏', '福州', '福建'), ('乌鲁木齐', '新疆', '石家庄', '河北'), ('乌鲁木齐', '新疆', '兰州', '甘肃')]}, {'section': 'family', 'correct': [('男孩', '女孩', '兄弟', '姐妹'), ..., ('叔叔', '阿姨', '继子', '继女')], 'incorrect': [('男孩', '女孩', '祖父', '祖母'), ('男孩', '女孩', '新郎', '新娘'), ('男孩', '女孩', '叔叔', '阿姨'), ('兄弟', '姐妹', '祖父', '祖母'), ('兄弟', '姐妹', '新郎', '新娘'), ('兄弟', '姐妹', '丈夫', '妻子'), ('兄弟', '姐妹', '叔叔', '阿姨'), ('爸爸', '妈妈', '祖父', '祖母'), ('爸爸', '妈妈', '孙子', '孙女'), ('爸爸', '妈妈', '国王', '王后'), ('父亲', '母亲', '祖父', '祖母'), ('父亲', '母亲', '孙子', '孙女'), ('祖父', '祖母', '孙子', '孙女'), ('祖父', '祖母', '新郎', '新娘'), ('祖父', '祖母', '丈夫', '妻子'), ('祖父', '祖母', '国王', '王后'), ('祖父', '祖母', '兄弟', '姐妹'), ('爷爷', '奶奶', '孙子', '孙女'), ('爷爷', '奶奶', '国王', '王后'), ('爷爷', '奶奶', '侄子', '侄女'), ('爷爷', '奶奶', '继子', '继女'), ('爷爷', '奶奶', '祖父', '祖母'), ('孙子', '孙女', '新郎', '新娘'), ('孙子', '孙女', '国王', '王后'), ('孙子', '孙女', '王子', '公主'), ('孙子', '孙女', '叔叔', '阿姨'), ('孙子', '孙女', '祖父', '祖母'), ('新郎', '新娘', '侄子', '侄女'), ('新郎', '新娘', '继子', '继女'), ('新郎', '新娘', '叔叔', '阿姨'), ('新郎', '新娘', '兄弟', '姐妹'), ('新郎', '新娘', '祖父', '祖母'), ('新郎', '新娘', '孙子', '孙女'), ('丈夫', '妻子', '国王', '王后'), ('丈夫', '妻子', '侄子', '侄女'), ('丈夫', '妻子', '王子', '公主'), ('丈夫', '妻子', '儿子', '女儿'), ('丈夫', '妻子', '继父', '继母'), ('丈夫', '妻子', '继子', '继女'), ('丈夫', '妻子', '叔叔', '阿姨'), ('丈夫', '妻子', '男孩', '女孩'), ('丈夫', '妻子', '兄弟', '姐妹'), ('丈夫', '妻子', '爸爸', '妈妈'), ('丈夫', '妻子', '父亲', '母亲'), ('丈夫', '妻子', '祖父', '祖母'), ('丈夫', '妻子', '爷爷', '奶奶'), ('丈夫', '妻子', '孙子', '孙女'), ('丈夫', '妻子', '新郎', '新娘'), ('国王', '王后', '叔叔', '阿姨'), ('国王', '王后', '祖父', '祖母'), ('国王', '王后', '新郎', '新娘'), ('男人', '女人', '侄子', '侄女'), ('男人', '女人', '叔叔', '阿姨'), ('男人', '女人', '祖父', '祖母'), ('侄子', '侄女', '叔叔', '阿姨'), ('侄子', '侄女', '父亲', '母亲'), ('侄子', '侄女', '祖父', '祖母'), ('侄子', '侄女', '新郎', '新娘'), ('王子', '公主', '继子', '继女'), ('王子', '公主', '叔叔', '阿姨'), ('王子', '公主', '祖父', '祖母'), ('王子', '公主', '新郎', '新娘'), ('王子', '公主', '丈夫', '妻子'), ('王子', '公主', '侄子', '侄女'), ('儿子', '女儿', '叔叔', '阿姨'), ('儿子', '女儿', '祖父', '祖母'), ('儿子', '女儿', '国王', '王后'), ('继父', '继母', '叔叔', '阿姨'), ('继父', '继母', '兄弟', '姐妹'), ('继父', '继母', '祖父', '祖母'), ('继父', '继母', '新郎', '新娘'), ('继父', '继母', '侄子', '侄女'), ('继父', '继母', '王子', '公主'), ('继子', '继女', '叔叔', '阿姨'), ('继子', '继女', '兄弟', '姐妹'), ('继子', '继女', '祖父', '祖母'), ('继子', '继女', '新郎', '新娘'), ('继子', '继女', '国王', '王后'), ('继子', '继女', '侄子', '侄女'), ('继子', '继女', '王子', '公主'), ('叔叔', '阿姨', '孙子', '孙女'), ('叔叔', '阿姨', '丈夫', '妻子'), ('叔叔', '阿姨', '王子', '公主')]}, {'section': 'Total accuracy', 'correct': [('雅典', '希腊', '曼谷', '泰国'), ..., ('叔叔', '阿姨', '继子', '继女')], 'incorrect': [('雅典', '希腊', '巴格达', '伊拉克'), ('雅典', '希腊', '北京', '中国'), ('雅典', '希腊', '伦敦', '英国'), ('雅典', '希腊', '罗马', '意大利'), ('雅典', '希腊', '斯德哥尔摩', '瑞典'), ('巴格达', '伊拉克', '北京', '中国'), ('巴格达', '伊拉克', '开罗', '埃及'), ('巴格达', '伊拉克', '罗马', '意大利'), ('曼谷', '泰国', '北京', '中国'), ('曼谷', '泰国', '赫尔辛基', '芬兰'), ('曼谷', '泰国', '罗马', '意大利'), ('曼谷', '泰国', '斯德哥尔摩', '瑞典'), ('北京', '中国', '堪培拉', '澳大利亚'), ('北京', '中国', '罗马', '意大利'), ('柏林', '德国', '奥斯陆', '挪威'), ('柏林', '德国', '罗马', '意大利'), ('柏林', '德国', '北京', '中国'), ('伯尔尼', '瑞士', '赫尔辛基', '芬兰'), ('伯尔尼', '瑞士', '奥斯陆', '挪威'), ('伯尔尼', '瑞士', '罗马', '意大利'), ('伯尔尼', '瑞士', '北京', '中国'), ('开罗', '埃及', '赫尔辛基', '芬兰'), ('开罗', '埃及', '渥太华', '加拿大'), ('开罗', '埃及', '罗马', '意大利'), ('开罗', '埃及', '斯德哥尔摩', '瑞典'), ('开罗', '埃及', '北京', '中国'), ('堪培拉', '澳大利亚', '赫尔辛基', '芬兰'), ('堪培拉', '澳大利亚', '伊斯兰堡', '巴基斯坦'), ('堪培拉', '澳大利亚', '伦敦', '英国'), ('堪培拉', '澳大利亚', '莫斯科', '俄罗斯'), ('堪培拉', '澳大利亚', '罗马', '意大利'), ('堪培拉', '澳大利亚', '斯德哥尔摩', '瑞典'), ('堪培拉', '澳大利亚', '北京', '中国'), ('河内', '越南', '罗马', '意大利'), ('河内', '越南', '斯德哥尔摩', '瑞典'), ('河内', '越南', '北京', '中国'), ('哈瓦那', '古巴', '罗马', '意大利'), ('哈瓦那', '古巴', '斯德哥尔摩', '瑞典'), ('哈瓦那', '古巴', '北京', '中国'), ('哈瓦那', '古巴', '柏林', '德国'), ('哈瓦那', '古巴', '河内', '越南'), ('赫尔辛基', '芬兰', '罗马', '意大利'), ('赫尔辛基', '芬兰', '德黑兰', '伊朗'), ('赫尔辛基', '芬兰', '巴格达', '伊拉克'), ('赫尔辛基', '芬兰', '北京', '中国'), ('赫尔辛基', '芬兰', '伯尔尼', '瑞士'), ('伊斯兰堡', '巴基斯坦', '罗马', '意大利'), ('伊斯兰堡', '巴基斯坦', '北京', '中国'), ('伊斯兰堡', '巴基斯坦', '伯尔尼', '瑞士'), ('喀布尔', '阿富汗', '罗马', '意大利'), ('喀布尔', '阿富汗', '斯德哥尔摩', '瑞典'), ('喀布尔', '阿富汗', '开罗', '埃及'), ('伦敦', '英国', '罗马', '意大利'), ('伦敦', '英国', '雅典', '希腊'), ('伦敦', '英国', '巴格达', '伊拉克'), ('伦敦', '英国', '伯尔尼', '瑞士'), ('伦敦', '英国', '堪培拉', '澳大利亚'), ('马德里', '西班牙', '罗马', '意大利'), ('马德里', '西班牙', '北京', '中国'), ('莫斯科', '俄罗斯', '罗马', '意大利'), ('莫斯科', '俄罗斯', '斯德哥尔摩', '瑞典'), ('莫斯科', '俄罗斯', '开罗', '埃及'), ('莫斯科', '俄罗斯', '堪培拉', '澳大利亚'), ('奥斯陆', '挪威', '罗马', '意大利'), ('奥斯陆', '挪威', '北京', '中国'), ('渥太华', '加拿大', '北京', '中国'), ('巴黎', '法国', '罗马', '意大利'), ('巴黎', '法国', '巴格达', '伊拉克'), ('巴黎', '法国', '北京', '中国'), ('巴黎', '法国', '伯尔尼', '瑞士'), ('巴黎', '法国', '开罗', '埃及'), ('罗马', '意大利', '斯德哥尔摩', '瑞典'), ('罗马', '意大利', '东京', '日本'), ('罗马', '意大利', '曼谷', '泰国'), ('罗马', '意大利', '北京', '中国'), ('罗马', '意大利', '开罗', '埃及'), ('罗马', '意大利', '堪培拉', '澳大利亚'), ('罗马', '意大利', '伦敦', '英国'), ('斯德哥尔摩', '瑞典', '北京', '中国'), ('斯德哥尔摩', '瑞典', '罗马', '意大利'), ('德黑兰', '伊朗', '北京', '中国'), ('德黑兰', '伊朗', '罗马', '意大利'), ('东京', '日本', '伯尔尼', '瑞士'), ('东京', '日本', '罗马', '意大利'), ('沈阳', '辽宁', '哈尔滨', '黑龙江'), ('沈阳', '辽宁', '贵阳', '贵州'), ('沈阳', '辽宁', '南宁', '广西'), ('沈阳', '辽宁', '银川', '宁夏'), ('长春', '吉林', '石家庄', '河北'), ('长春', '吉林', '合肥', '安徽'), ('长春', '吉林', '南昌', '江西'), ('长春', '吉林', '贵阳', '贵州'), ('哈尔滨', '黑龙江', '南京', '江苏'), ('合肥', '安徽', '太原', '山西'), ('合肥', '安徽', '沈阳', '辽宁'), ('合肥', '安徽', '长春', '吉林'), ('福州', '福建', '石家庄', '河北'), ('南昌', '江西', '长春', '吉林'), ('南昌', '江西', '福州', '福建'), ('郑州', '河南', '长春', '吉林'), ('郑州', '河南', '福州', '福建'), ('武汉', '湖北', '沈阳', '辽宁'), ('广州', '广东', '石家庄', '河北'), ('海口', '海南', '南京', '江苏'), ('贵阳', '贵州', '太原', '山西'), ('昆明', '云南', '长春', '吉林'), ('昆明', '云南', '乌鲁木齐', '新疆'), ('拉萨', '西藏', '福州', '福建'), ('南宁', '广西', '福州', '福建'), ('呼和浩特', '内蒙古', '太原', '山西'), ('银川', '宁夏', '福州', '福建'), ('乌鲁木齐', '新疆', '石家庄', '河北'), ('乌鲁木齐', '新疆', '兰州', '甘肃'), ('男孩', '女孩', '祖父', '祖母'), ('男孩', '女孩', '新郎', '新娘'), ('男孩', '女孩', '叔叔', '阿姨'), ('兄弟', '姐妹', '祖父', '祖母'), ('兄弟', '姐妹', '新郎', '新娘'), ('兄弟', '姐妹', '丈夫', '妻子'), ('兄弟', '姐妹', '叔叔', '阿姨'), ('爸爸', '妈妈', '祖父', '祖母'), ('爸爸', '妈妈', '孙子', '孙女'), ('爸爸', '妈妈', '国王', '王后'), ('父亲', '母亲', '祖父', '祖母'), ('父亲', '母亲', '孙子', '孙女'), ('祖父', '祖母', '孙子', '孙女'), ('祖父', '祖母', '新郎', '新娘'), ('祖父', '祖母', '丈夫', '妻子'), ('祖父', '祖母', '国王', '王后'), ('祖父', '祖母', '兄弟', '姐妹'), ('爷爷', '奶奶', '孙子', '孙女'), ('爷爷', '奶奶', '国王', '王后'), ('爷爷', '奶奶', '侄子', '侄女'), ('爷爷', '奶奶', '继子', '继女'), ('爷爷', '奶奶', '祖父', '祖母'), ('孙子', '孙女', '新郎', '新娘'), ('孙子', '孙女', '国王', '王后'), ('孙子', '孙女', '王子', '公主'), ('孙子', '孙女', '叔叔', '阿姨'), ('孙子', '孙女', '祖父', '祖母'), ('新郎', '新娘', '侄子', '侄女'), ('新郎', '新娘', '继子', '继女'), ('新郎', '新娘', '叔叔', '阿姨'), ('新郎', '新娘', '兄弟', '姐妹'), ('新郎', '新娘', '祖父', '祖母'), ('新郎', '新娘', '孙子', '孙女'), ('丈夫', '妻子', '国王', '王后'), ('丈夫', '妻子', '侄子', '侄女'), ('丈夫', '妻子', '王子', '公主'), ('丈夫', '妻子', '儿子', '女儿'), ('丈夫', '妻子', '继父', '继母'), ('丈夫', '妻子', '继子', '继女'), ('丈夫', '妻子', '叔叔', '阿姨'), ('丈夫', '妻子', '男孩', '女孩'), ('丈夫', '妻子', '兄弟', '姐妹'), ('丈夫', '妻子', '爸爸', '妈妈'), ('丈夫', '妻子', '父亲', '母亲'), ('丈夫', '妻子', '祖父', '祖母'), ('丈夫', '妻子', '爷爷', '奶奶'), ('丈夫', '妻子', '孙子', '孙女'), ('丈夫', '妻子', '新郎', '新娘'), ('国王', '王后', '叔叔', '阿姨'), ('国王', '王后', '祖父', '祖母'), ('国王', '王后', '新郎', '新娘'), ('男人', '女人', '侄子', '侄女'), ('男人', '女人', '叔叔', '阿姨'), ('男人', '女人', '祖父', '祖母'), ('侄子', '侄女', '叔叔', '阿姨'), ('侄子', '侄女', '父亲', '母亲'), ('侄子', '侄女', '祖父', '祖母'), ('侄子', '侄女', '新郎', '新娘'), ('王子', '公主', '继子', '继女'), ('王子', '公主', '叔叔', '阿姨'), ('王子', '公主', '祖父', '祖母'), ('王子', '公主', '新郎', '新娘'), ('王子', '公主', '丈夫', '妻子'), ('王子', '公主', '侄子', '侄女'), ('儿子', '女儿', '叔叔', '阿姨'), ('儿子', '女儿', '祖父', '祖母'), ('儿子', '女儿', '国王', '王后'), ('继父', '继母', '叔叔', '阿姨'), ('继父', '继母', '兄弟', '姐妹'), ('继父', '继母', '祖父', '祖母'), ('继父', '继母', '新郎', '新娘'), ('继父', '继母', '侄子', '侄女'), ('继父', '继母', '王子', '公主'), ('继子', '继女', '叔叔', '阿姨'), ('继子', '继女', '兄弟', '姐妹'), ('继子', '继女', '祖父', '祖母'), ('继子', '继女', '新郎', '新娘'), ('继子', '继女', '国王', '王后'), ('继子', '继女', '侄子', '侄女'), ('继子', '继女', '王子', '公主'), ('叔叔', '阿姨', '孙子', '孙女'), ('叔叔', '阿姨', '丈夫', '妻子'), ('叔叔', '阿姨', '王子', '公主')]}])

之前模型Accuracy (total)为:0.88,超过Yu et. al. (2017) (JWE) 为:0.85、Yin et. al. (2016) (Multi-Granularity Chinese Word Embedding)为:0.76和CBOW (baseline)为:0.79,腾讯AI实验室汉字词句嵌入语料库为0.79,表现不好

所以感觉之前训练的模型就已经很好了,腾讯AI实验室汉字词句嵌入语料库就感觉很多词应该分开的,而且这个需要实验室的服务器才可以跑,就留着备用吧,先用之前训练的模型

2. Doc2Vec

该算法通常优于Word2Vec向量的这种简单平均,一些教程:

  1. gensim教程官网
  2. API Doc2vec paragraph embeddings
  3. Doc2Vec Model

2.1 介绍

通过Quoc Le和Tomas Mikolov的分布式内存和分布式词袋模型学习段落和文档嵌入。“句子和文档的分布式表达”,这些算法使用分层softmax或负采样;参见Tomas Mikolov、Kai Chen、Greg Corrado和Jeffrey Dean:"Efficient Estimation of Word Representations in Vector Space, in Proceedings of Workshop at ICLR, 2013 “和Tomas Mikolov、Ilya Sutskever、Kai Chen、Greg Corrado和Jeffrey Dean:"Distributed Representations of Words and Phrases and their Compositionality. In Proceedings of NIPS, 2013”.在安装Gensim之前,请确保你有一个C编译器,以使用优化的doc2vec例程(与普通的NumPy实现相比,速度提高了70倍,https://rare-technologies.com/parallelizing-word2vec-in-python/)

2.2 准备训练和测试数据

对于本教程,我们将使用 gensim中包含的Lee Background语料库训练模型。该语料库包含从澳大利亚广播公司的新闻邮件服务中选择的314个文档,该新闻邮件提供标题故事的文本电子邮件,并涵盖许多广泛的主题,然后,我们将使用包含50个文档的短得多的Lee Corpus,通过肉眼测试模型

直接使用中文,参考此文,以及此文此文

import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

# from gensim.models import Doc2Vec
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

def operate(paragraph):
    x = []
    for i, text in enumerate(paragraph):
        word_list = text.split(' ')
        l = len(word_list)
        # word_list[l-1] = word_list[l-1].strip()
        document = TaggedDocument(word_list, tags=[i])
        x.append(document)
    return x


path = '... your path\\1\\test\\1.txt'
paragraph = []
with open(path, 'r', encoding='utf-8') as f:
    for line in f:
        paragraph.append(line.strip())
print(paragraph)
x = operate(paragraph)
print(x)

model = Doc2Vec(dm=1, window=3, vector_size=300, negative=5, workers=4, min_count=2, epochs=10)
model.build_vocab(x)
model.train(x, total_examples=model.corpus_count, epochs=model.epochs)

str = '这是 第几个 文本'
test_text = str.split(' ')
inferred_vector = model.infer_vector(doc_words=test_text)
# inferred_vector = model.infer_vector(doc_words=test_text, alpha=0.025, steps=500)
sims = model.docvecs.most_similar([inferred_vector], topn=2)
for count, sim in sims:
    sentence = paragraph[count]
    words = ''
    for word in sentence:
        words = words + word + ' '
    print(count, sim, words)

结果:

['这是 一个 文本', '这是 第二个 文本', '这是 又一个 文本', '这是 最后 一个 文本']
[TaggedDocument(words=['这是', '一个', '文本'], tags=[0]), TaggedDocument(words=['这是', '第二个', '文本'], tags=[1]), TaggedDocument(words=['这是', '又一个', '文本'], tags=[2]), TaggedDocument(words=['这是', '最后', '一个', '文本'], tags=[3])]
2021-03-25 19:43:32,565 : INFO : collecting all words and their counts
2021-03-25 19:43:32,565 : INFO : PROGRESS: at example #0, processed 0 words (0/s), 0 word types, 0 tags
2021-03-25 19:43:32,565 : INFO : collected 6 word types and 4 unique tags from a corpus of 4 examples and 13 words
2021-03-25 19:43:32,565 : INFO : Loading a fresh vocabulary
2021-03-25 19:43:32,565 : INFO : effective_min_count=2 retains 3 unique words (50% of original 6, drops 3)
2021-03-25 19:43:32,565 : INFO : effective_min_count=2 leaves 10 word corpus (76% of original 13, drops 3)
2021-03-25 19:43:32,565 : INFO : deleting the raw counts dictionary of 6 items
2021-03-25 19:43:32,566 : INFO : sample=0.001 downsamples 3 most-common words
2021-03-25 19:43:32,566 : INFO : downsampling leaves estimated 0 word corpus (5.7% of prior 10)
2021-03-25 19:43:32,566 : INFO : estimated required memory for 3 words and 300 dimensions: 13500 bytes
2021-03-25 19:43:32,566 : INFO : resetting layer weights
2021-03-25 19:43:32,568 : INFO : training model with 4 workers on 3 vocabulary and 300 features, using sg=0 hs=0 sample=0.001 negative=5 window=3
2021-03-25 19:43:32,573 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,573 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,573 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,573 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,573 : INFO : EPOCH - 1 : training on 13 raw words (6 effective words) took 0.0s, 3472 effective words/s
2021-03-25 19:43:32,577 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,577 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,577 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,577 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,577 : INFO : EPOCH - 2 : training on 13 raw words (4 effective words) took 0.0s, 3048 effective words/s
2021-03-25 19:43:32,580 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,580 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,581 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,581 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,581 : INFO : EPOCH - 3 : training on 13 raw words (4 effective words) took 0.0s, 2867 effective words/s
2021-03-25 19:43:32,584 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,584 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,584 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,584 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,584 : INFO : EPOCH - 4 : training on 13 raw words (7 effective words) took 0.0s, 5471 effective words/s
2021-03-25 19:43:32,586 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,586 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,586 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,586 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,586 : INFO : EPOCH - 5 : training on 13 raw words (4 effective words) took 0.0s, 4152 effective words/s
2021-03-25 19:43:32,588 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,589 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,589 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,589 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,589 : INFO : EPOCH - 6 : training on 13 raw words (4 effective words) took 0.0s, 3824 effective words/s
2021-03-25 19:43:32,591 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,591 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,591 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,591 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,591 : INFO : EPOCH - 7 : training on 13 raw words (4 effective words) took 0.0s, 12492 effective words/s
0 0.016417376697063446 这 是   一 个   文 本 
2 0.014370152726769447 这 是   又 一 个   文 本 
2021-03-25 19:43:32,594 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,594 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,594 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,594 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,594 : INFO : EPOCH - 8 : training on 13 raw words (4 effective words) took 0.0s, 11111 effective words/s
2021-03-25 19:43:32,597 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,597 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,597 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,597 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,597 : INFO : EPOCH - 9 : training on 13 raw words (4 effective words) took 0.0s, 3964 effective words/s
2021-03-25 19:43:32,600 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-25 19:43:32,600 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-25 19:43:32,600 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-25 19:43:32,600 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-25 19:43:32,600 : INFO : EPOCH - 10 : training on 13 raw words (4 effective words) took 0.0s, 3285 effective words/s
2021-03-25 19:43:32,600 : INFO : training on a 130 raw words (45 effective words) took 0.0s, 1398 effective words/s
2021-03-25 19:43:32,600 : WARNING : under 10 jobs per worker: consider setting a smaller `batch_words' for smoother alpha decay
2021-03-25 19:43:32,601 : INFO : precomputing L2-norms of doc weight vectors

训练信息:

2021-03-25 20:03:29,732 : INFO : collecting all words and their counts
2021-03-25 20:03:29,735 : INFO : PROGRESS: at example #0, processed 0 words (0/s), 0 word types, 0 tags
2021-03-25 20:03:34,746 : INFO : PROGRESS: at example #10000, processed 11410594 words (2278026/s), 591646 word types, 10000 tags
...
2021-03-25 20:19:39,736 : INFO : PROGRESS: at example #2350000, processed 756242458 words (462318/s), 6007996 word types, 2350000 tags
2021-03-25 20:19:44,829 : INFO : PROGRESS: at example #2360000, processed 758729997 words (488434/s), 6012382 word types, 2360000 tags
2021-03-25 20:19:45,228 : INFO : collected 6012644 word types and 2360831 unique tags from a corpus of 2360831 examples and 758929215 words
2021-03-25 20:19:45,233 : INFO : Loading a fresh vocabulary
2021-03-25 21:05:40,304 : INFO : effective_min_count=3 retains 1784709 unique words (29% of original 6012644, drops 4227935)
2021-03-25 21:05:40,310 : INFO : effective_min_count=3 leaves 753887523 word corpus (99% of original 758929215, drops 5041692)
2021-03-25 21:05:45,242 : INFO : deleting the raw counts dictionary of 6012644 items
2021-03-25 21:05:46,375 : INFO : sample=0.001 downsamples 21 most-common words
2021-03-25 21:05:46,375 : INFO : downsampling leaves estimated 694442549 word corpus (92.1% of prior 753887523)
2021-03-25 21:05:50,408 : INFO : estimated required memory for 1784709 words and 300 dimensions: 8008653300 bytes
2021-03-25 21:05:50,408 : INFO : resetting layer weights
2021-03-25 21:14:40,341 : INFO : training model with 4 workers on 1784709 vocabulary and 300 features, using sg=0 hs=0 sample=0.001 negative=5 window=3
2021-03-25 21:14:41,382 : INFO : EPOCH 1 - PROGRESS: at 0.01% examples, 405205 words/s, in_qsize 7, out_qsize 0
2021-03-25 21:14:42,388 : INFO : EPOCH 1 - PROGRESS: at 0.03% examples, 569573 words/s, in_qsize 7, out_qsize 0
...
2021-03-26 07:57:22,843 : INFO : EPOCH 20 - PROGRESS: at 99.91% examples, 356560 words/s, in_qsize 7, out_qsize 0
2021-03-26 07:57:23,873 : INFO : EPOCH 20 - PROGRESS: at 99.98% examples, 356556 words/s, in_qsize 8, out_qsize 0
2021-03-26 07:57:24,127 : INFO : worker thread finished; awaiting finish of 3 more threads
2021-03-26 07:57:24,131 : INFO : worker thread finished; awaiting finish of 2 more threads
2021-03-26 07:57:24,145 : INFO : worker thread finished; awaiting finish of 1 more threads
2021-03-26 07:57:24,152 : INFO : worker thread finished; awaiting finish of 0 more threads
2021-03-26 07:57:24,152 : INFO : EPOCH - 20 : training on 758929215 raw words (694833741 effective words) took 1948.8s, 356548 effective words/s
2021-03-26 07:57:24,155 : INFO : training on a 15178584300 raw words (13896694488 effective words) took 38563.8s, 360356 effective words/s
2021-03-26 07:57:24,161 : INFO : saving Doc2Vec object under /mnt/Data0/ysc_projects/doc2vec.model, separately None
2021-03-26 07:57:24,172 : INFO : storing np array 'syn1neg' to /mnt/Data0/ysc_projects/doc2vec.model.trainables.syn1neg.npy
2021-03-26 07:57:25,908 : INFO : storing np array 'vectors' to /mnt/Data0/ysc_projects/doc2vec.model.wv.vectors.npy
2021-03-26 07:57:30,998 : INFO : storing np array 'vectors_docs' to /mnt/Data0/ysc_projects/doc2vec.model.docvecs.vectors_docs.npy
2021-03-26 07:58:18,347 : INFO : saved /mnt/Data0/ysc_projects/doc2vec.model

Process finished with exit code 0		# 09:43

往服务器上发送与接受的命令如下:

scp -r Data.txt ysc@10.106.13.92:/mnt/Data1/ysc/

创建SSH Key

ssh-keygen -t rsa -C "youremail@xx.com"

C:\Users\your name\.ssh生成了id_rsaid_rsa.pub的文件,下载一个名为winsshd的软件,输入:

netstat -ano | findstr 22

查看端口22是否已开启

具体需要利用winsshd软件完成传输,参见此文

scp -r /mnt/Data0/ysc_projects/doc2vec.model sshuser@10.63.186.64:/d:/... your path/Doc2Vec/

完整代码:

import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

# from gensim.models import Doc2Vec
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

# def operate(paragraph):
#     x = []
#     for i, text in enumerate(paragraph):
#         word_list = text.split(' ')
#         l = len(word_list)
#         # word_list[l-1] = word_list[l-1].strip()
#         document = TaggedDocument(word_list, tags=[i])
#         x.append(document)
#     return x
#
#
path = '/mnt/Data1/ysc/Data.txt'
paragraph = []
with open(path, 'r', encoding='utf-8') as f:
    for line in f:
        paragraph.append(line.strip())
# x = operate(paragraph)
#
#
# model = Doc2Vec(dm=1, window=3, vector_size=300, negative=5, workers=4, min_count=3, epochs=20)     # min_count increase epoches decrease
# model.build_vocab(x)
# model.train(x, total_examples=model.corpus_count, epochs=model.epochs)
# model.save('/mnt/Data0/ysc_projects/doc2vec.model')

model = Doc2Vec.load('/mnt/Data0/ysc_projects/doc2vec.model')

import jieba
str = '上课时间暂未确定'
sentence_list = ' '.join(jieba.cut(str)).split(' ')
print(' '.join(sentence_list))
inferred_vector = model.infer_vector(doc_words=sentence_list)
sims = model.docvecs.most_similar([inferred_vector], topn=5)
for count, sim in sims:
    sentence = paragraph[count]
    words = ''
    for word in sentence:
        words = words + word + ' '
    print(count, sim, words)
上课 时间 暂 未确定
1964802 0.8744779229164124 遵 守   中 华 人 民 共 和 国   法 律 法 规   尊 重   网 上   道 德   承 担   因   的   行 为   而   直 接   间 接   引 起   的   法 律 责 任   人 民 网   河 南   频 道   拥 有   管 理   笔 名   和   留 言   的   权 力   在   人 民 网   河 南   频 道   留 言 板   发 表   的   言 论   人 民 网   河 南   频 道   有 权   在   网 站   内 转 载   引 用   如   对   管 理   有   意 见   请   向   留 言 板   管 理 员   人 民 网   河 南   频 道   反 映 
1278566 0.8714398741722107 中 国   雅 虎   侠 客   平 台   仅   提 供   信 息   存 储 空 间   服 务   其   内 容   均   由   上 网   用 户   提 供   中 国   雅 虎   提 示   尊 重   权 利   人   之   权 利   相 关   法 律   规 定   部 分   内 容   应   权 利   人   通 知   未 予   显 示   请 点   查 看 
1822531 0.8670005202293396 遵 守   中 华 人 民 共 和 国   法 律 法 规   尊 重   网 上   道 德   承 担   因   的   行 为   而   直 接   间 接   引 起   的   法 律 责 任   人 民 网   河 南   频 道   拥 有   管 理   笔 名   和   留 言   的   权 力   在   人 民 网   河 南   频 道   留 言 板   发 表   的   言 论   人 民 网   河 南   频 道   有 权   在   网 站   内 转 载   引 用   如   对   管 理   有   意 见   请   向   留 言 板   管 理 员   人 民 网   河 南   频 道   反 映 
1911599 0.8663280010223389 遵 守   中 华 人 民 共 和 国   法 律 法 规   尊 重   网 上   道 德   承 担   因   的   行 为   而   直 接   间 接   引 起   的   法 律 责 任   人 民 网   河 南   频 道   拥 有   管 理   笔 名   和   留 言   的   权 力   在   人 民 网   河 南   频 道   留 言 板   发 表   的   言 论   人 民 网   河 南   频 道   有 权   在   网 站   内 转 载   引 用   如   对   管 理   有   意 见   请   向   留 言 板   管 理 员   人 民 网   河 南   频 道   反 映 
1304048 0.8658890128135681 遵 守   中 华 人 民 共 和 国   法 律 法 规   尊 重   网 上   道 德   承 担   因   的   行 为   而   直 接   间 接   引 起   的   法 律 责 任   人 民 网   河 南   频 道   拥 有   管 理   笔 名   和   留 言   的   权 力   在   人 民 网   河 南   频 道   留 言 板   发 表   的   言 论   人 民 网   河 南   频 道   有 权   在   网 站   内 转 载   引 用   如   对   管 理   有   意 见   请   向   留 言 板   管 理 员   人 民 网   河 南   频 道   反 映 

可以发现句向量相似度表现不好

由Doc2Vec模型获取句向量如下:

model = Doc2Vec.load('/mnt/Data0/ysc_projects/doc2vec.model')
def get_sentence_vec(str):
    import jieba
    sentence_list = ' '.join(jieba.cut(str)).split(' ')
    inferred_vector = model.infer_vector(doc_words=sentence_list)
    return inferred_vector

参考以前的方法,对中文语句进行情感分析,使用支持向量机SVM的结果:

True
总训练句向量数据:579947
True
总测试句向量数据:6582
/home/ysc/anaconda3/lib/python3.8/site-packages/sklearn/svm/_base.py:976: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  warnings.warn("Liblinear failed to converge, increase "
Accuracy of svm on training set:0.71
Accuracy of svm on test set:0.67
0.6669705256760863

使用随机梯度下降结果:

Accuracy of sgd on training set:0.71
Accuracy of sgd on test set:0.68
0.6815557581282286

可以发现结果烂爆了

小结

  1. 腾讯AI实验室汉字词句嵌入语料库的相似度很好,但类比不好,与其停词的方法有关
  2. Doc2Vec效果很差,之后采用腾讯AI实验室汉字词句嵌入语料库生成句向量、Tf-Idf与词向量加权生成句向量、RNN生成句向量
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值