1

我有一个表,它有两列:(ID主键,自动增量)和keyword(文本,全文索引)。在该keyword列中输入的值包括:关键字

  • 汽车销售
  • 汽车
  • 跑车
  • 运动足
  • 车吧
  • 统计数据

假设我们有这个句子作为输入:

"Find sports car sales statistics in Manhattan."

我正在寻找(并且我已经搜索了很长时间)找到一个 MySQL 查询或一个接受给定输入的算法,并检测从keywords列中使用的关键字,从而产生以下输出:

"Sports cars", "Car sales", "Statistics"

换句话说,我试图以句子的形式输入,然后匹配数据库中在句子中找到的所有现有(和最相关的)关键字值。请注意,这些关键字可能是由空格分隔的单词组成的短语。

经过研究,我了解到 MySQL 通过其全文搜索功能做了类似的工作。我已经尝试了所有自然语言、布尔值和查询扩展选项,但它们包含的关键字记录只有一半的内容与输入匹配。例如,它输出:

"Car", "Car sales", "Sports cars", "Sports foo", "Cars bar", "Statistics".

我不希望这种情况发生,因为它包含甚至不在输入中的单词(即 foo 和 bar)。

这是上述搜索的 MySQL 查询:

SELECT * FROM tags WHERE MATCH(keyword) AGAINST('Find sports car sales statistics in Manhattan.' IN BOOLEAN MODE)

我也试图提高相关性,但这个只返回一条记录:

SELECT *, SUM(MATCH(keyword) AGAINST('Find sports car sales statistics in Manhattan.' IN BOOLEAN MODE)) as score FROM tags WHERE MATCH(keyword) AGAINST('Find sports car sales statistics in Manhattan.' IN BOOLEAN MODE) ORDER BY score DESC
4

1 回答 1

1

如果我们假设您将列放在列表中作为此类任务的 Pythonic 方式,您可以使用它set.intersection来获取两个集合之间的交集(第二个元素可以是另一个可迭代对象,如列表或元组):

>>> col={'Car','Car sales','Cars','Sports cars','Sports foo','Car bar','Statistics'}
>>> col={i.lower() for i in col}
>>> s="Find sports car sales statistics in Manhattan."
>>> col.intersection(s.strip('.').split())
set(['car', 'statistics'])

在您的情况下,您可以将查询结果放在 a 中set或将其转换为set.

注意:如果您的列为小写,则以下集合理解将转换元素:

>>> col={i.lower() for i in col}

但是这个配方会找到你的列和带有空格的分割字符串之间的交集。所以结果将是:

set(['car', 'statistics'])

作为另一种方式,您可以使用re.search

>>> col={'Car','Car sales','Cars','Sports cars','Sports foo','Car bar','Statistics'} 
>>> s='Find sports car sales statistics in Manhattan.'
>>> for i in col:
...    g=re.search('{}'.format(i),s,re.IGNORECASE)
...    if g:
...      print g.group(0)
... 
statistics
car sales
car

作为一种简单的方法,您可以使用如下函数来获取短语的组合:

from itertools import permutations
def combs(phrase):
    sp=phrase.split()
    com1=[map(lambda x:' '.join(x),li) for li in [permutations(sp,j) for j in range(1,len(sp)+1)]]
    for i,k in enumerate(sp):
          if not k.endswith('s'):
             sp[i]=k+'s'
    com2=[map(lambda x:' '.join(x),li) for li in [permutations(sp,j) for j in range(1,len(sp)+1)]]
    return com1+com2

print {j for i in combs('Car sales') for j in i}
set(['Car', 'sales', 'sales Cars', 'Car sales', 'Cars sales', 'sales Car', 'Cars'])

请注意,此功能可能更有效和更完整。

于 2015-05-16T14:02:50.540 回答