首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >语义词替换

语义词替换
EN

Stack Overflow用户
提问于 2016-09-20 21:00:46
回答 2查看 551关注 0票数 0

我试图找出“城市中的事件”的不同书写方式,它们在语义上是相似的。我试图通过查找语义上类似于“事件”的单词来实现这一点,这样我就可以在其中替换它们。

为了找到这些单词,我使用了nltk的wordnet语料库,但是我得到了一些非常奇怪的结果。例如,使用'event.n.01‘的下划词,我得到了“渥太华奇迹”。

同音词和高音词似乎同样糟糕或更糟。我想知道是否有人能更好地理解结构,并能提供一个潜在的解决方案?

下面是一些示例代码:

代码语言:javascript
运行
复制
!/usr/bin/python3

import nltk

lemma = 'event.n.01'
synset = nltk.corpus.wordnet.synset(lemma)

print("%s: %s" % (synset.name(), synset.definition()))

print("\nFinding hyponyms...")
print([s.split('.')[0] for w in synset.hyponyms() for s in w.lemma_names()])

print("\nFinding hypernym paths...")
print([s.split('.')[0] for hyprs in synset.hypernym_paths() for hypr in hyprs for s in hypr.lemma_names()])

print("\nFinding co-hyponyms...")
for hypers in synset.hypernym_paths():
        for hyper in hypers:
                print(hyper.name())
                for hypos in hyper.hyponyms():
                        print("\t%s" % (', '.join(hypos.lemma_names())))

print(synset.similar())
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-21 17:33:29

你可以采取一种深入的学习方法。训练一个word2vec模型,得到与“事件”向量最相似的向量。

您可以在这里测试一个模型,Word2Vec演示

票数 1
EN

Stack Overflow用户

发布于 2016-09-21 00:22:10

“事件”的下义词是“事件”的类型。其中一个是“奇迹”,另一些是:

代码语言:javascript
运行
复制
>>> [s for w in synset.hyponyms() for s in w.lemma_names][:7]  # is 7 enough? :)
['zap', 'act', 'deed', 'human_action', 'human_activity', 'happening', 'occurrence']

“事件的”超自然现象是极小的。“事件”是一种类型的术语:

代码语言:javascript
运行
复制
>>> synset.hypernyms()
[Synset('psychological_feature.n.01')]

你可以看到“事件”是它的下划词之一

代码语言:javascript
运行
复制
>>> synset.hypernyms()[0].hyponyms()
[Synset('motivation.n.01'), Synset('cognition.n.01'), Synset('event.n.01')]

这些并不是真正“相似”的术语(“渥太华的心理特征”对机器人来说似乎是一个正确的结果,但对人类来说则不然)。

也许从一个完全不同的角度去做比较好。

代码语言:javascript
运行
复制
>>> text = nltk.Text(word.lower() for word in nltk.corpus.brown.words())
>>> text.similar('event')
time day man order state way case house one place action night point
situation work year act and area audience

现在,把它们拿出来,按path_similarity进行排序:

代码语言:javascript
运行
复制
>>> words = 'time day man order state way case house one place action night point'\
...         ' situation work year act and area audience'.split()
>>> 
>>> def get_symilarity(synset, word):
...     return max([synset.path_similarity(synset2)
...                for synset2 in nltk.corpus.wordnet.synsets(word)]+[0])
>>> 
>>> sorted(words, key=lambda w: get_symilarity(synset, w), reverse=True)[:5]
['act', 'case', 'action', 'time', 'way']

结果好吗?我不知道。我想这是可行的:“渥太华的行动”、“纽约的案例”、“罗马的行动”、“东京的时间”、“阿姆斯特丹的方法”……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39603633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档