给定一个单词列表,如何开发一种算法方法来对它们进行语义分组?

Posted

技术标签:

【中文标题】给定一个单词列表,如何开发一种算法方法来对它们进行语义分组?【英文标题】:Given a list of words, how to develop an algorithmic way to semantically group them? 【发布时间】:2017-11-28 21:37:55 【问题描述】:

我正在使用 Google Places API,它们包含 97 个不同位置的 list。我想将位置列表减少到更少的数量 其中许多是可分组的。比如atmbank变成financialtemple, church, mosque, synagogue 变成worship; schooluniversity 变成 educationsubway_stationtrain_stationtransit_stationgas_station 转换为 transportation

但是,它也不应该过度概括;例如,pet_storecity_hallcourthouserestaurant 转换为 buildings 之类的东西。

我尝试了很多方法来做到这一点。首先,我从多个字典中下载了列表中 97 个单词中每一个的同义词。然后,我根据它们共有的唯一同义词的比例(Jaccard 相似度)找出了 2 个词之间的相似度:

但在那之后,我如何将单词分组?使用传统的聚类方法(k-means、k-medoid、层次聚类和 FCM),我没有得到任何好的聚类(我通过手动扫描结果发现了几个错误分类):

我什至尝试了在 Google 新闻数据上训练的 word2vec 模型(其中每个词都表示为 300 个特征的向量),但我也没有得到基于此的良好聚类:

【问题讨论】:

在我看来你的问题是题外话 @InferOn:你不理解一个问题并不意味着它是题外话。 @InferOn 我知道我的问题不完全是一个编程问题,但我需要一些关于如何去做的想法。由于我不知道有任何其他平台可以征求意见,所以我求助于 ***。 我认为没有好的解决方案。可以进行多种分类,例如,如果您去那里工作或娱乐,您可以对这些地方进行分类。 @***user2010 实际上有 softwareengineering.stackexchange.com 用于此目的 【参考方案1】:

您可能正在寻找与向量空间降维相关的内容。在这些技术中,您需要一个文本语料库,将位置用作文本中的单词。然后,降维会将这些术语组合在一起。您可以阅读Latent Dirichlet Allocation 和潜在语义索引。一个很好的参考是 Manning 等人的“Introduction to Information Retrieval”,第 18 章。请注意,这本书是 2009 年的,所以很多进步没有被记录下来。正如您所指出的,已经有很多工作,例如 word2vec。另一个很好的参考是 Jurafsky 和 ​​Martin 的“Speech and Language Processing”,第 16 章。

【讨论】:

我确实检查了潜在狄利克雷分配。问题是,我只有单词——我没有使用每个单词的文档或句子集合。因此,我不确定如何使用 LDA。有什么想法吗? 只需谷歌搜索“NLP 报纸语料库”或“NLP 网络语料库”。会有很多结果。 @Kristada673:由于您处理的是物理位置,我还建议您搜索有关旅游、旅行和本地企业的语料库。【参考方案2】:

您需要更多更多数据。

在没有额外数据的情况下,没有任何算法会将ATMbankfinancial 关联起来。因为这需要了解这些术语。

Jaccard 相似度无法获得这些知识,它只能作用于单词。然后“河岸”和“银行支行”很相似。

所以不要指望算法会发生魔法。你需要魔法才能在数据中......

【讨论】:

我知道。这就是为什么我自己创建了他们的同义词列表,我在上面写道:“首先,我从多个字典中下载了列表中 97 个单词中每个单词的同义词。然后,我根据唯一性的比例找出了 2 个单词之间的相似性它们共有的同义词(Jaccard 相似度)”。 同义词也无济于事。在您删除所有唯一词之后,您得到了多少个同义词?您几乎没有相似性信息。数据不够。您可以尝试为每篇文章查找 Wikipedia 文章,然后测量整篇文章的文本相似性,然后它可能会开始工作。或者你使用所有提到这件事的网页。

以上是关于给定一个单词列表,如何开发一种算法方法来对它们进行语义分组?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习算法小结

算法:计算单词列表频率的更好方法

如何创建启动器来对我的 Jumplists 进行分组

产品命名算法

如何在 Oracle Apex 中过滤给定单词的穿梭列表?

我可以将给定的单词(String)表示为数字吗?