【问题标题】:Group by similar words按相似词分组
【发布时间】:2016-08-25 14:27:50
【问题描述】:

有没有办法按文本字段对表格进行分组,考虑到该文本字段并不总是完全相同?

例子:

select city_hotel, count(city_hotel)
from hotels, temp_grid
where st_intersects(hotels.geom, temp_grid.geom)
and potential=1
and part=4
group by city_hotel
order by (city_hotel) desc

我得到的输出是预期的,例如,城市名称和计数:

    "Vassiliki ";1
    "Vassiliki";1
    "Vassilias, Skiathos";1
    "Vassilias";5
    "Vasilikí";25
    "Vasiliki";23
    "Vasilias";1

但我想对这个字段进行更多分组,并且只获取一个“Vasiliki”(或一个包含所有内容的数组,这不是问题)和包含它们之间类似内容的所有单元格的计数。

我不知道这是否可能。也许一些文本分析或类似的功能?

【问题讨论】:

  • 取决于文本字段的内容。您如何识别“集群”,即属于一起的那些不同的值?
  • 这就是我期望 Postgres 做的事情。找到匹配它们的模式,然后连接。有可能还是科幻小说?
  • 我手边没有 Postgres 实例,但我看到它支持 soundex:postgresql.org/docs/9.1/static/fuzzystrmatch.html。这有帮助吗?
  • @ppardoz 这可能不是科幻小说,但它也可能不会自动发生。请记住,对于数据库来说,这些名称只是一堆乱七八糟的字符,只有我们才能赋予这些东西以意义。例如,我自己无法判断 VassilikiVassilias 应该组合在一起。但是您可能想在信息检索的上下文中查找 stemming,这可能会对您有所帮助。
  • 这肯定不是科幻。几年前,我使用来自(前面提到的)fuzzystrmatch 扩展的 levenstein 函数完成了它。您需要做的就是编写自己的,虽然非常简单的函数,它允许您输入相似度百分比作为参数,最后您将获得一个非常优雅和简单的查询。

标签: regex postgresql text-mining


【解决方案1】:
SELECT COUNT(*), `etc` FROM table GROUP BY textfield LIKE '%sili%'; 

// The '%' is a SQL wildcard, which matches as many of any character as required.

您可以执行上述操作,为“like”选择一个最适合您的用户使用的拼写的词。

可以帮助解决这个问题的方法是做一个

SELECT COUNT(*), textfield FROM table GROUP BY textfield ORDER BY textfield;

并为您的单词选择最“平均”的拼写。 否则,您将开始进行一些语言处理,为此您需要编写一些 SQL 之外的代码。

这类似于https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance

在任意误差范围内查找相同的单词。

这里有一个 MySQL 实现,您应该可以根据需要进行转置 https://stackoverflow.com/a/6392380/1287480

(信用https://stackoverflow.com/a/3515291/1287480

.

(关于该主题的个人想法)

您真的很想考虑限制用户的输入,因为这些输入可能会给您带来这个问题。为用户提供一个可供选择的地点列表要比将潜在的“脏”信息推送到您的数据库中要好得多。最终总是以您稍后尝试清理信息而告终。多年来一直困扰着许多人的问题。

【讨论】:

  • 我们正在努力限制来自用户的输入,但目前这是我需要处理的数据。是第三方数据,所以我只能尝试清理以使用它。
  • 这是可以理解的。我将在那里留下我的评论,以供将来可能与您处于不同位置的该问题的访问者。此答案是否满足您的需求?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2012-07-17
相关资源
最近更新 更多