Как сгенерировать все n-граммы в Hive - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы создать список n-грамм, используя HiveQL.Моя идея состояла в том, чтобы использовать регулярное выражение с предвкушением и функцией разделения - это не работает, хотя:должно быть:

["This is","is my","my sentence"]
["This is","is another","another sentence"]

В Hive есть n-граммовый udf, но функция напрямую вычисляет частоту n-грамм - я хотел бы получить список всех n-граммвместо этого.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 14 октября 2018

Возможно, это не самое оптимальное, но вполне работоспособное решение.Разделите предложение по разделителю (в моем примере это один или несколько пробелов или запятых), затем взорвитесь и объединитесь, чтобы получить n-грамм, затем соберите массив из n-грамм, используя collect_set (если вам нужны уникальные n-грамм) или collect_list:

with src as 
(
select source_data.sentence, words.pos, words.word
  from
      (--Replace this subquery (source_data) with your table
       select stack (2,
                     'This is my sentence', 
                     'This is another sentence'
                     ) as sentence
      ) source_data 
        --split and explode words
        lateral view posexplode(split(sentence, '[ ,]+')) words as pos, word
)

select s1.sentence, collect_set(concat_ws(' ',s1.word, s2.word)) as ngrams 
      from src s1 
           inner join src s2 on s1.sentence=s2.sentence and s1.pos+1=s2.pos              
group by s1.sentence;

Результат:

OK
This is another sentence        ["This is","is another","another sentence"]
This is my sentence             ["This is","is my","my sentence"]
Time taken: 67.832 seconds, Fetched: 2 row(s)
...