我需要对一组消费者数据运行聚类算法,但我不确定如何处理基于文本的字段(一个完美的例子是字母数字邮政编码,例如SE1 8XR)。
显然,我需要使用的是字符串核,我理解其基本概念,但还不够深入,无法成功实现。
理想情况下,我希望新的数值向量能够编码这样一个概念:两个邮政编码越不相似,它们之间的数据点就越远,但我不知道如何做到这一点,而且我找不到任何有用的教程、指南或教科书!
另外,我是在Python中进行这项工作,以防有人知道有用的库。
回答:
关于邮政编码
你不能将邮政编码作为字符串来比较。’AL1 1AA’是圣奥尔本斯,而’AB1 1AA’是阿伯丁。它们在编辑距离上非常接近,但CR6 7DX更接近圣奥尔本斯 🙂
你最好的方法可能是获取一些查找表(我知道你可以从Royalmail购买),或许可以从http://www.ordnancesurvey.co.uk/oswebsite/products/os-opendata.html获取,该表可以将邮政编码,或者至少是扇区’AL1 1’(甚至是地区’AL1’)映射到经纬度,然后你可以使用这些数据进行分组。
其他字符串
一个可能的选项是使用difflib.SequenceMatcher
,它返回两个字符串彼此相似程度的百分比分数(还有很多其他算法:谷歌“遗传字符串算法”、“模糊字符串匹配”、“字符串相似性算法”等…)。将所有(可能)80%相似的字符串分组,并为这些字符串分配一个组 – 然后在这个组上进行聚类。
根据你的需求和数据的复杂性,你可能还会发现metaphone和双重metaphone(以及可能的ntlk
)有用。