【问题标题】:How to generate all n-grams in Hive如何在 Hive 中生成所有 n-gram
【发布时间】:2018-10-12 14:58:41
【问题描述】:

我想使用 HiveQL 创建一个 n-gram 列表。我的想法是使用带有前瞻和拆分功能的正则表达式 - 但是这不起作用:

select split('This is my sentence', '(\\S+) +(?=(\\S+))');

输入是表单的一列

|sentence                 |
|-------------------------|
|This is my sentence      |
|This is another sentence |

输出应该是:

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

Hive 中有一个 n-gram udf,但该函数直接计算 n-gram 的频率 - 我想要一个所有 n-gram 的列表。

提前非常感谢!

【问题讨论】:

    标签: sql hadoop hive hiveql n-gram


    【解决方案1】:

    这可能不是最佳但非常有效的解决方案。按分隔符拆分句子(在我的示例中,它是一个或多个空格或逗号),然后分解并连接以获得 n-gram,然后使用 collect_set(如果您需要唯一的 n-gram)或 @ 组装 n-gram 数组987654322@:

    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)
    

    【讨论】:

    • 太棒了。有什么和stack相反的吗?
    • @Bala Stack 是我在演示中使用的 UDTF,而不是真实表。没有 from + UNION ALL 的多个选择常量也可以做同样的事情,但它的工作速度很慢。阵列+爆炸也是可能的。堆栈是执行此操作的最简单和最快的方法
    猜你喜欢
    • 2012-01-05
    • 2014-10-10
    • 2018-02-20
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多