python - 在 MySQL 中搜索短语关键字

标签 python mysql regex search phrase

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

  • 汽车
  • 汽车销售
  • 汽车
  • 跑车
  • 体育运动
  • 车吧
  • 统计

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

"Find sports car sales statistics in Manhattan."

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

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

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

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

"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

最佳答案

如果我们假设您将列表中的列作为此类任务的 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'])

在您的情况下,您可以将查询结果放在 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'])

请注意,此功能可能会更高效、更完整。

关于python - 在 MySQL 中搜索短语关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276448/

相关文章:

python - 优雅的关闭和信号处理

sql - 糟糕的 MySQL 连接性能

php - 帮助将 PHP eregi 转换为 preg_match

java - 使用 Positive Lookbehind 出现意外的正则表达式行为

python - django:选择具有特定属性的manytomany对象的最佳方式

python - 如何获得数据框的简单散点图(最好使用 seaborn)

python - 如何根据用户输入对列表列表进行排序?

php - 用 PHP 比较两个不同的 mysqli_fetch_array 的结果

mysql - 选择列中包含确切数字的行,其中一组数字用逗号分隔

javascript - 使用正则表达式将最后一个逗号分隔值替换为另一个值