2017-10-16 17 views
0

タイトルテキストがあります。 "英国で最も危険な仕事のトップ5"。 単語「危険」を含むすべての行と、それらの間の距離が3ワードの単語「英国」を検索したい。Google Bigquery Regexpを使用した近接検索

上記のテキストのように、テキストに「危険」と「英国」という単語が含まれていて、それらの間の距離も3ワードであるため、条件に一致する必要があります。

私は、構文の下に試してみました:

SELECT PubName,Title 
    From emp.final_month 
    WHERE REGEXP_CONTAINS(Title,r'\b?(dangerous).*(UK)\b?') 

(クエリの上に私にそれらの間の位置に基づいて、単語「危険」と「英国」ではなくを持っているすべてを提供します。)

ない置く方法がわから上記のクエリの位置。誰でもBigQueryでサポートされているregexpの正しい構文を手に入れることができます。

正規表現の構文も歓迎します。

+0

は、r '\ bdangerous '試し(?:\ W + \ + W){0,3} W + UK \ \ –

+0

@wiktor、いやそれdidntの仕事b''。たとえ私が(0,6)を与えても、それらの間に3つの単語だけ一致する必要があるので、それは私には記録が残っていません。 –

+0

大文字小文字を区別しない場合は、次の操作を行う必要があります。SELECT PublisherName、Headline content.feed_2017_09_30から REGEXP_CONTAINS(LOWER(見出し)、r '\ bdangerous \ b(?:\ w + [ - ]){3} \ buk \ b ')。他人を助けるかもしれない –

答えて

1

です:

\bdangerous\b (?:\w+[- ]){3}\bUK\b 

が、それは大文字と小文字が区別だと注意し、doesnの」に「危険な」と「英国」の間の句読点を説明する。

\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' 
+0

@ Anthony..Thanksそれは魅力のように働いています。あなたは私の一日の仲間を救った。大文字小文字を区別しないようにする必要がある場合はどうすればよいですか? –

+0

Regexの構文の詳細についても説明してください。私はそれが私のような初心者に特に助けになるかもしれないと信じています。 –

+1

ところで、パターンを '\ bdangerous(?:\ w + [ - ]){3} UK \ b'に減らすことができます。 –

2

方向のアイデアとしてのアプローチの下に試してみてください - それはあなたがこの正規表現しようとすることができ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 
+0

私はあなたのクエリを試してみましたが、私は "MAX(w1.pos - w2。)"を追加しなければなりませんでした。 pos-1)= 3 "である。しかし、私のクエリクエリの生成はダイナミックで、テキストがどのようにハードコーディングされているかはわかりません。私は私のケースでは正しい解決策とは思わない。しかし、努力のおかげで。 –

+0

「テキストをハードコーディングする」とはどういう意味ですか? –

+0

私は間違ってしまった。私の悪い...私はテキストをハードコードする必要はありません前に数分を実現しました。しかし、私のクエリ生成は動的なので、私はRegexソリューションを探していました。 –

関連する問題