найти все фразы из двух слов, которые встречаются более чем в одной строке набора данных

Мы хотели бы запустить запрос, который возвращает две словосочетания, которые появляются более чем в одной строке. Так, например. возьмите строку «Data Ninja». Поскольку он появляется более чем в одной строке нашего набора данных, запрос должен вернуть его. Запрос должен найти все такие фразы из всех строк в нашем наборе данных, запрашивая две соседние комбинации слов (образующие фразу) в строках, которые находятся в наборе данных. Эти две соседние комбинации слов должны быть взяты из набора данных, который мы загрузили в BigQuery.

Как мы можем написать этот запрос в Google BigQuery?

Набор данных представляет собой просто длинный список английских предложений.


person Saqib Ali    schedule 10.09.2013    source источник


Ответы (2)


Хорошие новости: BigQuery теперь поддерживает функцию SPLIT(). Проверьте https://stackoverflow.com/a/24172995/132438.


Это хак, но хак мне нравится :).

В своем нынешнем виде он работает только для предложений, содержащих более двух слов, и извлекает только 6 первых пар. Вы можете расширить и протестировать отсюда.

Попробуйте это на своих данных и, пожалуйста, отчитайтесь.

SELECT pairs, COUNT(*) c FROM
(
SELECT REGEXP_REPLACE(title, '([^\\s]+ ){0}([^\\s]* [^\\s]+).*', '\\2') pairs, title
FROM [bigquery-samples:reddit.full]
),
(
SELECT REGEXP_REPLACE(title, '([^\\s]+ ){1}([^\\s]* [^\\s]+).*', '\\2') pairs, title
FROM [bigquery-samples:reddit.full]
),
(
SELECT REGEXP_REPLACE(title, '([^\\s]+ ){2}([^\\s]* [^\\s]+).*', '\\2') pairs, title
FROM [bigquery-samples:reddit.full]
),
(
SELECT REGEXP_REPLACE(title, '([^\\s]+ ){3}([^\\s]* [^\\s]+).*', '\\2') pairs, title
FROM [bigquery-samples:reddit.full]
),
(
SELECT REGEXP_REPLACE(title, '([^\\s]+ ){4}([^\\s]* [^\\s]+).*', '\\2') pairs, title
FROM [bigquery-samples:reddit.full]
),
(
SELECT REGEXP_REPLACE(title, '([^\\s]+ ){5}([^\\s]* [^\\s]+).*', '\\2') pairs, title
FROM [bigquery-samples:reddit.full]
)
WHERE pairs != title
GROUP EACH BY pairs
HAVING c > 1
LIMIT 1000

Результаты могут содержать слова NSFW. Образец набора данных получен из интернет-сообщества, которое не было «очищено». Воздержитесь от запуска запроса, если вы чувствительны к некоторым словам.

person Felipe Hoffa    schedule 10.09.2013

Очень полезный лайфхак, который вдохновил меня на решение моей проблемы, спасибо.

Мои данные представляют собой комбинацию пассажиров и их возраста, где возраст представляет собой строку чисел:

adults ages
------ -------------
  4    "53,67,65,68"       
  4    "44,45,69,65" 
  3    "20,21,20"
  3    "30,32,62"

Я хотел добавить в каждую строку столбец, содержащий разницу в возрасте между самым высоким и самым низким значением

adults ages          agediff
------ ------------- -------
   4   "53,67,65,68" 15       
   4   "44,45,69,65" 25
   3   "20,21,20"    1
   3   "30,32,62"    32

Это было сделано следующим, сильно вдохновленным взломом:

SELECT adults, ages, SUBTRACT(INTEGER(maxage),INTEGER(minage)) agediff FROM 
 (SELECT adults, ages, max(age) maxage, min(age) minage FROM
  (SELECT adults, ages, age FROM 
   (SELECT adults, ages, REGEXP_EXTRACT(ages, r'([\d\d\,]{2})') age FROM [PaxAgeCombinations] WHERE (adults="3")),
   (SELECT adults, ages, REGEXP_EXTRACT(ages, r'\d\d\,([\d\d\,]{2})') age FROM [PaxAgeCombinations] WHERE (adults="3")),
   (SELECT adults, ages, REGEXP_EXTRACT(ages, r'\d\d\,\d\d\,([\d\d\,]{2})') age FROM [PaxAgeCombinations] WHERE (adults="3"))
  ),
  (SELECT adults, ages, age FROM 
   (SELECT adults, ages, REGEXP_EXTRACT(ages, r'([\d\d\,]{2})') age FROM [PaxAgeCombinations] WHERE (adults="4")),
   (SELECT adults, ages, REGEXP_EXTRACT(ages, r'\d\d\,([\d\d\,]{2})') age FROM [PaxAgeCombinations] WHERE (adults="4")),
   (SELECT adults, ages, REGEXP_EXTRACT(ages, r'\d\d\,\d\d\,([\d\d\,]{2})') age FROM [PaxAgeCombinations] WHERE (adults="4")),
   (SELECT adults, ages, REGEXP_EXTRACT(ages, r'\d\d\,\d\d\,\d\d\,([\d\d\,]{2})') age FROM [PaxAgeCombinations] WHERE (adults="4"))
  )

)

person Charlotta Öijer Thalén    schedule 10.06.2014
comment
Это круто! И у меня есть хорошие новости: BigQuery теперь поддерживает SPLIT(). Проверьте stackoverflow.com/a/24172995/132438. - person Felipe Hoffa; 12.06.2014