当前位置: 首页 > 面试题库 >

如何在Hive中生成所有n-gram

欧阳山
2023-03-14
问题内容

我想使用HiveQL创建一个n-gram列表。我的想法是使用带正则表达式和split函数的正则表达式-但这不起作用,但是:

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的列表。

在此先多谢!


问题答案:

这可能不是最佳的解决方案,但却是可行的解决方案。用定界符分割句子(在我的示例中是一个或多个空格或逗号),然后爆炸并合并以得到n-
gram,然后使用collect_set(如果需要唯一的n-gram)或n组合n-gram数组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)


 类似资料:
  • 问题内容: 我正在寻找一种生成元素列表的所有可能排列的方法。类似于python的 区别在于我不在乎排列是按需生成(例如python中的生成器)还是全部生成。我也不关心它们是否按字典顺序排序。我所需要做的就是以某种方式获得这些排列。 问题答案: 产生置换的算法很多。我发现的最简单的方法之一是堆算法: 通过选择一对要交换的元素,它会根据前一个生成每个排列。 在上面的链接中概述了这个想法和一个伪代码一个

  • 我想从数组创建所有可能的数组可能大于或小于。输出数组中的元素不必是唯一的。 例如: 根据这个数组 给定所需大小的函数,应返回: 例2 根据这个数组 给定所需大小的函数,应返回: 用Swift怎么做?

  • 问题内容: 我正在尝试生成所有可能的长度N总计为S的列表。我已经编写了一些代码来这样做,但是在任何大的东西上(特别是我希望N = 5,S = 100),我都遇到了内存溢出错误。 我正在寻找一个更好的解决方案,或者一种方法来改进我的代码,以便可以在N = 5,S = 100上运行它。下面的这两个程序协同工作,以在嵌套列表中创建所有可能的数字组合,然后将它们重新加工为正确的格式。以下是一些示例输出。

  • 问题内容: 目前,我试图让所有可能的组合从的,是每一个元素只包含一个字母。 在本身包含相同字母两次甚至更多,他们只应该,因为他们经常会出现使用。 在稍后应该含有最多的给定的长度从最小的2个字母的所有组合。 我在此处搜索了stackoverflow,但只发现了忽略以下事实的置换函数:每个字母仅在出现时才经常使用。 这是我的第一个Swift 2项目,所以请原谅我的绿色态度:) 我想要的是 我目前的做法

  • 问题内容: 我正在用Python编写一个Chess程序,该程序需要生成骑士的所有动作。对于那些不熟悉国际象棋的人,骑士会以L形移动。 因此,考虑的位置,骑士可以移动到,,,)等共(最多)八个不同的移动。 我想编写一个函数,该函数在列表中生成这些元组。在Python中最简单的方法是什么? 问题答案: 好的,感谢Niall Byrne,我想到了这个:

  • 在JavaFX应用程序中创建nxn网格最简单的方法是什么? 我寻找的唯一要求是网格的大小将始终占用相同的空间量,因此更多的正方形=更小的正方形。我可以为正方形设置颜色,并且可以将鼠标悬停在每个正方形上,并能够为每个正方形显示一些颜色。 我不会知道'N',直到程序运行并解析一些数据以计算出我需要多少个总平方,这是当我计算我可以使用的最小NxN网格时。 据我所知,我的选择是: < li>GridPan