使用正则表达式的 Google Bigquery Proximity 搜索
Posted
技术标签:
【中文标题】使用正则表达式的 Google Bigquery Proximity 搜索【英文标题】:Google Bigquery Proximity search using Regexp 【发布时间】:2017-10-16 16:34:45 【问题描述】:我有标题文本,例如“英国最危险的 5 种工作”。 我想找到包含单词“dangerous”和单词“UK”的所有行,它们之间的距离为 3 个单词。
就像上面的文字一样,它应该符合我的条件,因为文字包含单词“dangerous”和“UK”,它们之间的距离也是 3 个单词。
我尝试了以下语法:
SELECT PubName,Title
From emp.final_month
WHERE REGEXP_CONTAINS(Title,r'\b?(dangerous).*(UK)\b?')
(上面的查询给了我所有包含“危险”和“英国”的词,但不是基于它们之间的位置。)
不确定如何在上述查询中放置位置。任何人都可以帮助获得 BigQuery 支持的正则表达式的正确语法。
也欢迎使用 Regex 中的语法。
【问题讨论】:
试试r'\bdangerous(?:\W+\w+)0,3\W+UK\b'
@wiktor,不,它没有用。即使我给 (0,6) 它仍然让我得到不应该的记录,因为它应该只匹配它们之间的 3 个单词。
为了不区分大小写,我需要执行以下操作: SELECT PublisherName,Headline From content.feed_2017_09_30 WHERE REGEXP_CONTAINS(LOWER(Headline),r'\bdangerous\b (?:\w+[- ]) 3\buk\b')。它可能会帮助其他人
我理解“内”是 0 到 3 个单词。当然,如果您需要完全 3 个字:r'\bdangerous(?:\W+\w+)3\W+UK\b'
,则需要删除 0,
并使其不区分大小写,请尝试 r'(?i)\bdangerous(?:\W+\w+)3\W+UK\b'
【参考方案1】:
尝试以下方法作为方向的想法 - 它适用于 BigQuery 标准 SQL
#standardSQL
WITH `emp.final_month` AS (
SELECT 'Top 5 most dangerous jobs in the UK' AS title UNION ALL
SELECT 'Top most dangerous 5 jobs in the UK' AS title
),
words AS (
SELECT title, word, pos
FROM `emp.final_month`, UNNEST(REGEXP_EXTRACT_ALL(title, r'[\w_]+') ) AS word WITH OFFSET pos
WHERE word IN ('dangerous', 'UK')
ORDER BY title, pos
)
SELECT w1.title title
FROM words w1 JOIN words w2
ON w1.title = w2.title
AND w1.word != w2.word
AND w1.pos > w2.pos
GROUP BY title
HAVING MIN(w1.pos - w2.pos - 1) = 3
【讨论】:
我尝试了您的查询,但我还必须添加“MAX(w1.pos - w2.pos - 1) = 3”。但是我的查询查询生成将是动态的,不确定文本的硬编码将如何工作。在我的情况下,我认为这不是一个正确的解决方案。但感谢您的努力。 “硬编码文本”是什么意思? 我弄错了。我的错..几分钟前我意识到我不必对文本进行硬编码。但由于我的查询生成是动态的,我更倾向于寻找正则表达式解决方案。 当然。如果您最终得到更复杂的标准,希望我的回答中的解决方案会对您有所帮助。同时,如果您认为有帮助,请考虑投票【参考方案2】:你可以试试这个正则表达式:
\bdangerous\b (?:\w+[- ])3\bUK\b
请注意,它区分大小写,并且不考虑“危险”和“英国”之间的标点符号。
\bdangerous\b : the word 'dangerous' followed by a space
(?: ): a non-capturing group...
( \w+ ): consisting of one or more word characters...
( [- ]): followed by either a hyphen or a space...
3: repeated three times (i.e. three words)
\bUK\b: the word 'UK'
【讨论】:
@Anthony..谢谢它的魅力。你救了我的好朋友。如果我必须让它不区分大小写怎么办。 能否请您解释一下正则表达式的语法细节。我相信它可以帮助其他人,尤其是像我这样的新手。 BTW,模式可以简化为\bdangerous (?:\w+[- ])3UK\b
您可以尝试使用 i 标志来区分大小写以上是关于使用正则表达式的 Google Bigquery Proximity 搜索的主要内容,如果未能解决你的问题,请参考以下文章
使用 mysql 正则表达式验证我的 google bigquery 数据库中的电子邮件地址
用 Google BigQuery 中的文字替换正则表达式字符
将猪拉丁正则表达式代码转换为 Google BigQuery
通过正则表达式过滤器过滤 Google BigQuery 列