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

快速n-gram计算

司寇阳朔
2023-03-14
问题内容

我正在使用NLTK在语料库中搜索n-
gram,但是在某些情况下会花费很长时间。我已经注意到,计算n元语法在其他软件包中并不罕见(显然,Haystack具有某些功能)。如果我放弃NLTK,这是​​否意味着可以以更快的方式在语料库中查找n-
gram?如果是这样,我可以使用什么来加快速度?


问题答案:

由于您没有指明是想要单词级还是字符级的n-gram,因此我将假设前者,而不会失去一般性。

我还假设您从以字符串表示的令牌列表开始。您可以轻松地做自己写n-gram提取。

def ngrams(tokens, MIN_N, MAX_N):
    n_tokens = len(tokens)
    for i in xrange(n_tokens):
        for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
            yield tokens[i:j]

然后将替换为yield您要对每个n-gram采取的实际操作(将其添加到n-gram,将其dict存储在数据库中,无论如何),以消除生成器开销。

最后,如果确实不够快,请将以上内容转换为Cython并进行编译。使用defaultdict代替的示例yield

def ngrams(tokens, int MIN_N, int MAX_N):
    cdef Py_ssize_t i, j, n_tokens

    count = defaultdict(int)

    join_spaces = " ".join

    n_tokens = len(tokens)
    for i in xrange(n_tokens):
        for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
            count[join_spaces(tokens[i:j])] += 1

    return count


 类似资料:
  • 问题内容: 我有以下代码。我知道我可以使用函数过滤掉少于频率计数的搭配。但是,在决定设置过滤频率之前,我不知道如何获取文档中所有n- gram元组(在我的情况下为bi-gram)的频率。如您所见,我正在使用nltk搭配类。 问题答案: 该功能有效

  •   一个n-gram是一个包含n个tokens(如词)的序列。NGram可以将输入特征 转换为n-grams。   NGram输入一系列的序列,参数n用来决定每个n-gram的词个数。输出包含一个n-grams序列,每个n-gram表示一个划定空间的连续词序列。 如果输入序列包含的词少于n,将不会有输出。 import org.apache.spark.ml.feature.NGram val w

  • 问题内容: 如何生成字符串的n元语法,例如: 我想用此输入生成n-gram: 输出应为: 用Java给出一些想法,如何实现它,或者是否有可用的库。 我正在尝试使用此NGramTokenizer,但它给出了n- gram的字符序列,而我想要n-gram的单词序列。 问题答案: 您正在寻找ShingleFilter。 更新:链接指向版本3.0.2。在更高版本的Lucene中,此类可能位于不同的包中。

  • 最近,我一直在尝试用斯坦福核心NLP来训练n-gram实体。我遵循了以下教程--http://nlp.stanford.edu/software/crf-faq.shtml#b 这样,我就可以只指定unigram标记和它所属的类。有谁能引导我,让我把它延伸到n克。我正试图从聊天数据集中提取像电影名称这样的已知实体。 如果我误解了斯坦福教程,请指导我,同样的教程可以用于N克培训。

  • 我试图得到一个单词的1,2,3克后缀,并在我的模型中使用它们作为特征。 例, 此外,我是NLP新手,不知道如何在我的ML模型中使用这n克作为特征。如何将这些“字符串”n-gram特性转换为某种数字表示,以便在我的模型中使用它们。 谁能帮帮我吗?

  • 问题内容: 我想使用HiveQL创建一个n-gram列表。我的想法是使用带正则表达式和split函数的正则表达式-但这不起作用,但是: 输入是表格的一列 输出应该是: Hive中有一个n-gram udf,但是该函数直接计算n-gram的频率-我想改为列出所有n-gram的列表。 在此先多谢! 问题答案: 这可能不是最佳的解决方案,但却是可行的解决方案。用定界符分割句子(在我的示例中是一个或多个空