我必须手动浏览用户多年来输入的一长串术语(~3500)。除此之外,我想通过查找同义词、错别字和替代拼写来减少列表。
如果我可以在开始之前将列表分组到可能的拼写错误集群中,我的工作会容易得多。我想象使用一些指标来计算与术语的相似性,例如以百分比为单位,然后将相似性高于某个阈值的所有内容聚类。无论如何,我都是手动完成的,我不介意高故障率,如果它可以保持整个事情的简单性。
理想情况下,有一些容易获得的库可以为我做到这一点,由知道自己在做什么的人实现。如果没有这样的,那么至少一个计算一对字符串的相似性指标会很棒,我可以自己管理聚类。
如果这也不可用,您知道一个易于实现的好算法吗?我最初认为汉明距离除以单词长度将是一个很好的指标,但注意到虽然它会捕获交换的字母,但它不会很好地处理删除和插入(ptgs-1
会被捕获为与ptgs/1
非常相似,但hematopoiesis
不会被捕获为与haematopoiesis
非常相似)。
至于对库/算法的要求:它必须完全依赖于拼写。我知道通常的 NLP 库不能以这种方式工作,但是
- 没有全文可供它考虑上下文。
- 它不能使用词典语料库,因为这些术语远远超出了任何日常语言,通常是高度专业化术语的缩写。
最后,我最熟悉C#作为一种编程语言,我已经有一个C#伪脚本可以进行一些初步清理。如果没有一步解决方案(源列表输入,分组列表输出),我将更喜欢可以从 .NET 程序中调用的库。
对于一个在信息检索方面几乎没有知识的人来说,整个事情应该相对快速地学习。这将为我节省 5-6 个小时的手动工作,而且我不想在设置自动化解决方案上花费更多的时间。好吧,如果我有机会学到一些很棒的东西,可能会延长 50% :)
问题:我应该使用什么,库还是算法?我应该考虑哪些?如果我需要一个库,我如何识别一个能够仅根据拼写提供结果的库,而不是依赖于上下文或字典的使用?
编辑 澄清一下,我并不是在寻找搜索或推荐引擎需要的实际语义相关性。我需要抓住错别字。因此,我正在寻找一个指标,通过该指标,mouse
和rodent
的相似性为零,但mouse
和house
具有非常高的相似性。而且我担心像Lucene这样的工具使用了一个指标,会弄错这两个例子(为了我的目的)。
您正在寻找根据语义相关性对术语进行聚类。
一种(困难的)方法是遵循马尔科维奇和加布里洛维奇的方法。
更快的方法将包括以下步骤:
- 下载维基百科转储和开源信息检索库,如Lucene(或 Lucene.NET)。
- 为文件编制索引。
- 搜索索引中的每个术语 - 并获取一个向量 - 表示术语(查询)与每个文档的相关性。请注意,这将是一个大小为
|D|
的向量,其中|D|
是集合中文档的总数。 - 在任何聚类算法中对向量进行聚类。每个向量代表初始列表中的一个项。
如果你只对"视觉"相似性感兴趣(单词彼此写得相似),那么你可以满足于levenshtein距离,但它将无法给你术语的语义相关性。例如,您将无法在"秋天"和"秋天"之间建立联系。