方案一:利用预训练好的词向量模型

优点: (1)能把词进行语义上的向量化(2)能得到词与词的相似度

缺点: (1)词向量的效果和语料库的大小和质量有较大的关系(2)用most_similar() 得到往往不是“同义词”,而是“共现词”

  1. from gensim.models.keyedvectors import KeyedVectors
  2.  
  3. wv = KeyedVectors.load_word2vec_format('model/w2v_chisim_300d.bin', binary=True)
  4. print "wv.vector_size:", wv.vector_size #
  5. print "len(wv.vocab):", len(wv.vocab) #
  6.  
  7. def get_similar_words(kw):
  8. if kw in wv.vocab:
  9. print kw, "/".join([word for word, sim in wv.most_similar(kw, topn=10)])
  10. # for word, sim in wv.most_similar(kw): # most_similar()的默认topn=10
  11. # print word, sim # 相似词、相似度
  12.  
  13. if __name__ == '__main__':
  14. kws = [u"群众", u"男人", u"女人", u"国王", u"皇后"]
  15. for kw in kws:
  16. get_similar_words(kw)
  17.  
  18. """
  19. wv.vector_size: 300
  20. len(wv.vocab): 414638
  21. 群众 广大群众/百姓/职工群众/村民/老百姓/干部群众/农民/党员干部/困难群众/居民
  22. 男人 女人/女孩子/伴侣/女性/你/异性/男性/闺蜜/她们/花心
  23. 女人 男人/女孩子/女性/她们/你/花心/闺蜜/伴侣/异性/男性
  24. 国王 五世/王后/四世/君主/七世/六世/教皇/伊莉莎白/二世/路易十四
  25. 皇后 娘娘/公主/妃子/皇太后/皇帝/日本天皇/武则天/董鄂氏/太后/那拉氏
  26. """

方案二:同义词近义词库

比较经典的是哈工大社会计算与信息检索研究中心同义词词林扩展版

把词条按照树状的层次结果组织到一起,并区分了同义词和近义词,例如:

为了和上面词向量的结果进行对比,这里贴出了词林的结果:

  1. Aa01B02= 群众 大众 公众 民众 万众 众生 千夫
  2. Ab01A01= 男人 男子 男子汉 男儿 汉子 丈夫 官人 男人家 光身汉 须眉 壮汉 男士
  3. Ab01B01= 女人 女子 女性 女士 女儿 妇女 妇道 妇人 女人家 小娘子 女郎 巾帼 半边天 娘子军 石女 红装 家庭妇女 农妇 才女
  4. Af05A01= 皇帝 天子 天皇 帝王 君王 国王 国君 君主 当今 皇上 圣上 陛下 主公 九五 九五之尊 可汗 单于 大帝 沙皇 天骄 天王 五帝 太岁 王者 至尊 统治者
  5. Af05B02= 皇后 王后 娘娘

可以看到词林在“同义”上的效果会更好一些。

1. 数据下载

哈工大同义词词林扩展版官网:https://www.ltp-cloud.com/download/#down_cilin

注册账户之后会看到下载链接和密码(z55c)

我在linux下打开文件出现乱码,需要用iconv命令进行转码(参考本人前面的文章Linux下打开windows中文文本乱码问题

如果文件中因存在不能识别的字符导致转码失败,用gedit打开并把那一行的非法字符删除就可以了。原有17817行,转码之后我保留了17815行。

(本来想贴到这里来的,但因为包含了gongchandang, jiangzemin, dalai, qietingqi等等,博客园会报错“Post operation failed. The error message related to this problem was as follows: 博文中含有违规内容: xxx!”......)

2. 数据处理和应用

在哈工大的同义词词林中,由于它给词分了类别,同一个词在不同的类别下可能会有不同的同义词,例如“男人”的同义词有:

  1. Ab01A01= 男人 男子 男子汉 男儿 汉子 丈夫 官人 男人家 光身汉 须眉 壮汉 男士
  2. Ah08A01= 丈夫 爱人 男人 先生 女婿 老公 汉子 当家的 人夫 那口子

为方便后续的应用,这里把这两行的词都合并到“男人”的同义词列表中,并在词后面加上type(=或者#),方便区分同义词与近义词,生成字典{词type: 同义词列表},例如:

  1. {"毛乎乎=": ["糙", "毛糙", "麻", "毛", "粗糙"], "车次#": ["等次", "名次", "班次", "航次", "场次"]}

代码如下:

  1. def get_kw2similar_words(fin, fout):
  2. kw2similar_words = defaultdict(set) # 去重
  3. with codecs.open(fin, "r", "utf-8") as fr:
  4. for idx, line in enumerate(fr):
  5. try:
  6. row = line.strip().split(" ")
  7. if row[0][-1] == u"@": continue
  8. for kw in row[1:]:
  9. row.remove(kw)
  10. kw_and_type = kw + row[0][-1]
  11. kw2similar_words[kw_and_type].update(row[1:])
  12. row.insert(-1, kw)
  13. except Exception as error:
  14. print "Error line", idx, line, error
  15. if idx % 1000 == 0: print idx
  16. for kw, similar_words in kw2similar_words.iteritems():
  17. kw2similar_words[kw] = list(similar_words) # kw2similar_words = defaultdict(list)
  18. json.dump(kw2similar_words, open(fout, "w"), ensure_ascii=False)
  19.  
  20. get_kw2similar_words(fin="data/cilin.txt", fout="data/kw2similar_words.json")

测试:

  1. if __name__ == '__main__':
  2. kw2similar_words = json.load(open("data/kw2similar_words.json", "r"))
  3. keys_set = set(kw2similar_words.keys())
  4. kws = [u"群众", u"男人", u"女人", u"国王", u"皇后"]
  5. for kw in kws:
  6. for kw_and_type in [kw + u"=", kw + u"#"]:
  7. if kw_and_type in keys_set:
  8. print kw_and_type, "/".join(kw2similar_words[kw_and_type])
  9.  
  10. """
  11. 群众= 大众/万众/民众/公众/众生/千夫
  12. 男人= 男人家/爱人/女婿/先生/壮汉/汉/汉子/士/人夫/男士/老公/那口子/官人/丈夫/男子汉/男子/男儿/当家的/光身汉/须眉/夫
  13. 女人= 妇道/太太/妇/老婆/娘/娘子/女人家/红装/妻子/女儿/媳妇儿/老婆子/内/家/婆姨/妻/女性/巾帼/婆娘/家庭妇女/娘儿们/女子/小娘子/妻妾/老小/娘子军/农妇/女郎/才女/妻室/妇女/半边天/内助/贤内助/石女/爱妻/爱人/家里/妇人/女士/女/老伴/夫人
  14. 国王= 可汗/王/上/沙皇/至尊/君王/君/帝/帝王/主公/圣上/五帝/君主/大帝/国君/天王/单于/统治者/天骄/天皇/九五/九五之尊/皇帝/陛下/皇上/王者/天子/当今/太岁
  15. 皇后= 娘娘/王后
  16. """

3. 中文同义词近义词的其它在线词典

词林在线词典 http://www.cilin.org/

同义词库 http://chinese.abcthesaurus.com/

汉典 http://www.zdic.net/

参考:

中文的同义词近义词词典或网站有哪些值得推荐?

[汉语]类书、叙词表、分类词典、同义词、反义词词典...

同义词、近义词、反义词词典

中英文维基百科语料上的Word2Vec实验

哈工大同义词词林 python 使用范例

【中文同义词近义词】词向量 vs 同义词近义词库的更多相关文章

  1. 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器

    首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...

  2. 词嵌入向量WordEmbedding

    词嵌入向量WordEmbedding的原理和生成方法   WordEmbedding 词嵌入向量(WordEmbedding)是NLP里面一个重要的概念,我们可以利用WordEmbedding将一个单 ...

  3. elasticsearch高亮之词项向量

    一.什么是词项向量 词项向量(term vector)是有elasticsearch在index document的时候产生,其包含对document解析过程中产生的分词的一些信息,例如分词在字段值中 ...

  4. 机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)

    函数说明: 1. from gensim.model import word2vec  构建模型 word2vec(corpus_token, size=feature_size, min_count ...

  5. DeepNLP的核心关键/NLP词的表示方法类型/NLP语言模型 /词的分布式表示/word embedding/word2vec

    DeepNLP的核心关键/NLP语言模型 /word embedding/word2vec Indexing: 〇.序 一.DeepNLP的核心关键:语言表示(Representation) 二.NL ...

  6. NLP基础——词集模型(SOW)和词袋模型(BOW)

    (1)词集模型(Set Of Words): 单词构成的集合,集合自然每个元素都只有一个,也即词集中的每个单词都只有一个. (2)词袋模型(Bag Of Words): 如果一个单词在文档中出现不止一 ...

  7. Python 爬取 热词并进行分类数据分析-[解释修复+热词引用]

    日期:2020.02.02 博客期:141 星期日 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  8. 机器学习入门-文本数据-构造Ngram词袋模型 1.CountVectorizer(ngram_range) 构建Ngram词袋模型

    函数说明: 1 CountVectorizer(ngram_range=(2, 2)) 进行字符串的前后组合,构造出新的词袋标签 参数说明:ngram_range=(2, 2) 表示选用2个词进行前后 ...

  9. 纯前端实现词云展示+附微博热搜词云Demo代码

    前言 最近工作中做了几个数据可视化大屏项目,其中也有用到了词云展示,以前做词云都是用python库来生成图片显示的,这次用了纯前端的实现(Ctrl+V真好用),同时顺手做个微博热搜的词云然后记录一下~ ...

随机推荐

  1. Job流程:提交MR-Job过程

    1.一个标准 MR-Job 的执行入口: //参数 true 表示检查并打印 Job 和 Task 的运行状况 System.exit(job.waitForCompletion(true) ? 0 ...

  2. Graph_Master(连通分量_G_Trajan+Thought)

    Graph_Master~(连通分量) 题目大意:给出m条边(隧道,无向),每条边连接两个点(矿场).要在这些矿场中建设救援出口,防止矿场坍塌造成人员伤亡,问最少需要几个救援出口,以及对应方案数.(假 ...

  3. 从0开始 Java学习 packet用法

    packet 包的用法 参考博客:https://www.cnblogs.com/Ring1981/p/6240412.html 用法 java 源文件带有包名,往往容易出错 如:H:\code\He ...

  4. POJ 1208 模拟

    2017-08-28 15:07:16 writer:pprp 好开心,这道题本来在集训的时候做了很长很长时间,但是还是没有做出来,但是这次的话,只花了两个小时就做出来了 好开心,这次采用的是仔细分析 ...

  5. Python学习札记(三) I/O

    参考:输入和输出 I/O 1.print()函数 a.调用print()输出字符串有以下两种方式:(1)print('[字符串]') (2)print("[字符串]") b.调用p ...

  6. Codeforces Round #365 (Div. 2) D - Mishka and Interesting sum(离线树状数组)

    http://codeforces.com/contest/703/problem/D 题意: 给出一行数,有m次查询,每次查询输出区间内出现次数为偶数次的数字的异或和. 思路: 这儿利用一下异或和的 ...

  7. 【Python】更优的字符串格式化方式 -- "format"替代"%s"

    背景 前段时间看了一篇介绍Python的代码技巧的文章,建议格式化字符串时使用"format"代替使用"%",但是没有说明原因.各博客网站介绍相关用法的博客很多 ...

  8. 深度学习中 Batch Normalization为什么效果好

    看mnist数据集上其他人的CNN模型时了解到了Batch Normalization 这种操作.效果还不错,至少对于训练速度提升了很多. batch normalization的做法是把数据转换为0 ...

  9. SqlLocalDB命令

    SqlLocalDB info    (查询所有LocalDB实例) SqlLocalDB start 实例名称    (查看某个LocalDB实例状态信息) SqlLocalDB create 实例 ...

  10. 使用lock锁或Monitor.Enter的目的

    锁定的目的:由于多个线程 并行/并发 处理同一个“数据对象”(比如:在其它线程的某个地方发生了Clear.Add.Remove.Change等操作),导致“数据对象”不断变化,没法用了,所以,为了保证 ...