gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:59:49 25 4
gpt4 key购买 nike

我有一个包含两列的表: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com