这是一个更复杂的后续问题:查找顺序值的有效方法
每个产品可以有许多Segment行(数千).每个段的位置列从每个产品(1,2,3,4,5等)开始为1,值列可以包含任何值,如(323.113,5423.231,873.42,422.64,763.1等). ).数据是只读的.
将产品视为歌曲并将片段视为歌曲中的一组音符可能会有所帮助.
给定一个连续片段的子集,如歌曲的片段,我想确定产品的潜在匹配.但是,由于测量潜在的错误,子集中的片段可能不匹配数据库中的部分正好.
如何通过查找与我测量的细分子集最匹配的产品细分来识别候选产品?此外,数据库是此类数据的最佳媒介吗?
以下是关于我如何解决这个问题的一些想法.请不要将这些作为确切要求.我对任何类型的算法都持开放态度,以使这项工作尽可能最好.我认为需要有多个阈值变量来确定贴近度.一种可能性是实现接近阈值和匹配阈值.
例如,给定以下值:
Product A contains these segments: 11,21,13,13,15.
Measurement 1 has captured: 20,14,14,15.
Measurement 2 has captured: 11,21,78,13.
Measurement 3 has captured: 15,13,21,13,11.
Run Code Online (Sandbox Code Playgroud)
如果接近度阈值所允许的测量段为1以上或实际段的下方,然后测量1可能因为尽管许多段不匹配匹配产品A 完全相同,它们相对于实际值的接近度阈值内.
如果匹配阈值允许匹配为3或更多的测量,则测量2可以返回产品A,因为尽管其中一个段(78)远远超过接近阈值,但它仍然以正确的顺序匹配3个段,因此在匹配门槛.
测量3与产品A不匹配,因为尽管所有测量的段都存在于实际段中,但它们不在接近或匹配阈值内.
更新:其中一个答案要求我定义最接近匹配的意思.我不确定如何回答这个问题,但我会试着通过继续这首歌的比喻来解释.假设片段代表录制歌曲的最大频率.如果我再次录制同一首歌,它会有相似之处,但是由于背景噪音和录音设备的其他限制,有些频率会匹配,有些会很接近,有些会很接近.在这种情况下,您如何定义一个录音与另一个录音"匹配"的时间?这是我正在寻找在这个问题中使用的相同类型的匹配逻辑.
我正在努力将FLT应用到我正在构建的原型ES系统中.我已经查看了Elasticsearch网站上的文档,虽然它已经存在,但我似乎无法实现这一点.也许有人可以给我一些关于如何做到这一点的见解.
我似乎无法在网络上的其他地方找到任何这方面的例子,但也许我的谷歌技能今天没有达到标准.这是我到目前为止设法建造的 -
$ curl -XGET 'http://127.0.0.1:9200/uber/uber/_search?' -d '{
"fuzzy_like_this": {
"fields": [
"pty_firstname",
"pty_surname"
],
"like_text": "Nathan Andew",
"max_query_terms": 12
}
}'
Run Code Online (Sandbox Code Playgroud)
以下是我在发送请求时从提示中收到的错误消息 -
{
"error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure;
shardFailures {[u9HfJxbXRn-8ml19FKBTiA][uber][2]: SearchParseException[[uber][2]: from[-1],size[-1]:
Parse Failure [Failed to parse source [
{
"fuzzy_like_this": {
"fields": [
"pty_firstname",
"pty_surname"
],
"like_text": "Nathan Andew",
"max_query_terms": 12
}
}
]]]; nested: SearchParseException[[uber][2]: from[-1],size[-1]:
Parse Failure [No parser for element [fuzzy_like_this]]]; }{[u9HfJxbXRn-8ml19FKBTiA][uber][0]:
SearchParseException[[uber][0]: from[-1],size[-1]:
Parse Failure [Failed to parse source [ …Run Code Online (Sandbox Code Playgroud) 我有一个充满客户数据的SAP Oracle数据库.在我们的自定义CRM中,使用通配符搜索客户是很常见的.除了SAP标准搜索之外,我们还想对一些类似于输入名称的名称进行模糊文本搜索.目前我们正在使用该UTL_MATCH.EDIT_DISTANCE功能搜索相似的名称.唯一的缺点是不可能使用一些通配符模式.
是否有可能将通配符与UTL_MATCH.EDIT_DISTANCE函数结合使用,或者有不同(甚至更好)的方法吗?
比方说,数据库中有以下名称:
PATRICK NOR
ORVILLE ALEX
OWEN TRISTAN
OKEN TRIST
Run Code Online (Sandbox Code Playgroud)
查询可能看起来像OKEN*IST*两个OWEN TRISTAN并且OKEN TRISTAN应该返回.OKEN将是100%匹配,OWEN更少.
我当前的测试查询看起来像:
SELECT gp.partner, gp.bu_sort1, UTL_MATCH.edit_distance(gp.bu_sort1, ?) as edit_distance,
FROM but000 gp
WHERE UTL_MATCH.edit_distance(gp.bu_sort1, ?) < 4
Run Code Online (Sandbox Code Playgroud)
此查询工作正常,除非*在搜索字符串中使用通配符(这很常见).
我有目录号到产品名的映射:
35 cozy comforter
35 warm blanket
67 pillow
Run Code Online (Sandbox Code Playgroud)
并且需要一个能够找到拼写错误的混合名称的搜索,例如"warm cmfrter".
我们使用edit-distance(difflib)编写代码,但它可能无法扩展到18000个名称.
我实现了与Lucene类似的东西,但由于PyLucene只包装了Java,这会使部署复杂化到最终用户.
SQLite通常没有编译的全文或评分.
该Xapian的绑定就像是C++,并且有一定的学习曲线.
嗖尚未详细记录,但包括滥用的拼写检查.
那里还有什么?
我正在尝试使用模糊结果进行匹配查询,并根据编辑距离对结果进行排序。然而,elasticsearch 返回一个基于频率和每个查询的相关性分数 (_score)。无论如何,有没有办法仅从elasticsearch 获取编辑距离。另外,编写我自己的自定义函数来计算编辑距离是否会减慢搜索速度?
我已经实现了一个模糊匹配算法,我想使用一些带有测试数据的示例查询来评估它的召回率。
假设我有一个包含文本的文档:
{"text": "The quick brown fox jumps over the lazy dog"}
Run Code Online (Sandbox Code Playgroud)
我想看看我是否可以通过测试诸如“sox”或“hazy drog”而不是“fox”和“lazy dog”之类的查询来检索它。
换句话说,我想向字符串添加噪音以生成拼写错误的单词(错别字)。
自动生成带有拼写错误的单词以评估模糊搜索的方法是什么?
我正在检查 4 个相同的数据框列中是否有类似的结果(模糊匹配),我有以下代码作为示例。当我将它应用到真正的 40.000 行 x 4 列数据集时,会一直运行在永恒中。问题是代码太慢了。例如,如果我将数据集限制为 10 个用户,则计算需要 8 分钟,而需要 20、19 分钟。有什么我想念的吗?我不知道为什么这需要那么长时间。我希望在 2 小时或更短的时间内获得所有结果。任何提示或帮助将不胜感激。
from fuzzywuzzy import process
dataframecolumn = ["apple","tb"]
compare = ["adfad","apple","asple","tab"]
Ratios = [process.extract(x,compare) for x in dataframecolumn]
result = list()
for ratio in Ratios:
for match in ratio:
if match[1] != 100:
result.append(match)
break
print (result)
Run Code Online (Sandbox Code Playgroud)
输出:[('asple', 80), ('tab', 80)]
我在 ElasticSearch 中使用模糊搜索选项。它太酷了。
但是我在搜索有空格的值时遇到了一个问题。例如说我有两个值:
"Pizza"
"Pineapple Pizza"
Run Code Online (Sandbox Code Playgroud)
我使用以下查询搜索 Pizza:
client.search({
index: 'food_index',
body: {
query: {
fuzzy: {
name: {
value: "Pizza",
transpositions: true,
}
},
}
}
})
Run Code Online (Sandbox Code Playgroud)
返回的值是:
"Pizza"
"Pineapple Pizza"
Run Code Online (Sandbox Code Playgroud)
这是预期的。但是,如果我在查询中输入值“Pineapple Pizza”:
client.search({
index: 'food_index',
body: {
query: {
fuzzy: {
name: {
value: "Pineapple Pizza",
transpositions: true,
}
},
}
}
})
Run Code Online (Sandbox Code Playgroud)
返回的值是:
""
Run Code Online (Sandbox Code Playgroud)
空的
这是为什么?它应该是完全匹配的。我正在考虑将所有包含空格的名称切换为下划线。所以“Pineapple Pizza”将是“Pineapple_Pizza”(这个解决方案对我有用)。但我问这个问题是希望找到更好的选择。我在这里做错了什么?
我有一个场景,我有需要能够搜索的非正式通信数据。因此,我想要全文搜索,但我也要弄清楚拼写错误。问题是如何考虑拼写错误以便能够进行模糊全文搜索?
这在Postgres Full Text Search is Good Enough中非常简要地讨论过,该文章讨论了拼写错误。
所以我建立了一个“文档”表,创建了索引等。
CREATE TABLE data (
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
text TEXT NOT NULL);
Run Code Online (Sandbox Code Playgroud)
我可以创建一个额外的 tsvector 类型的列并相应地索引......
alter table data
add column search_index tsvector
generated always as (to_tsvector('english', coalesce(text, '')))
STORED;
create index search_index_idx on data using gin (search_index);
Run Code Online (Sandbox Code Playgroud)
例如,我有一些文本,其中数据显示“气球”,但有人可能会搜索“气球”,所以我插入了两行(一排故意拼错)...
insert into data (text) values ('baloon');
insert into data (text) values ('balloon');
select * from data;
id | text | search_index
----+---------+--------------
1 | …Run Code Online (Sandbox Code Playgroud) 我有以下数据框:
d_test = {
'name' : ['South Beach', 'Dog', 'Bird', 'Ant', 'Big Dog', 'Beach', 'Dear', 'Cat'],
'cluster_number' : [1, 2, 3, 3, 2, 1, 4, 2]
}
df_test = pd.DataFrame(d_test)
Run Code Online (Sandbox Code Playgroud)
我想识别name列中相似的名称(如果这些名称属于一个簇编号)并为它们创建唯一的 ID。例如South Beach和Beach属于簇号1,它们的相似度得分相当高。所以我们将它与唯一的 id 关联起来,比如说1。下一个簇是数字2,列中的三个实体name属于该簇:Dog、Big Dog和Cat。Dog并且Big Dog具有很高的相似度分数,并且他们的唯一 ID 将是,比如说2。对于Cat唯一的 id 来说,是3。等等。
我为上面的逻辑创建了一个代码:
# pip install thefuzz
from thefuzz import fuzz …Run Code Online (Sandbox Code Playgroud) fuzzy-search ×10
python ×4
search ×2
algorithm ×1
curl ×1
database ×1
duplicates ×1
fuzzywuzzy ×1
javascript ×1
lucene ×1
nlp ×1
node.js ×1
oracle ×1
pandas ×1
postgresql ×1
sql ×1
sql-server ×1
wildcard ×1