如何找到 ngram 在句子中的位置?

How to find position of an ngram in a sentence?

有没有办法找到ngram在句子中的第一个位置?

>>> from nltk import ngrams
>>> hyp = ['he', 'read', 'the', 'book', 'because', 'he', 'was', 'interested', 'in', 'world', 'history']
>>> position_of_ngram(('the', 'book'), hyp)
2

目前,我正在使用一些字符串技巧:

>>> " ".join(hyp)[:" ".join(hyp).index(" ".join(('the', 'book')))].count(' ')
2

但是 有没有一种不需要愚蠢的字符串转换的方法? 如果是这样,那是不是比 "string/regex hack" 更快的方法?

您可以使用一个函数来遍历单词列表的切片:

>>> def position_of_ngram(words,hyp):
...     lenght=len(words)
...     for i,sublist in enumerate((hyp[i:i+lenght] for i in range(len(hyp)))):
...         if words==sublist:
...            return i
...     return None

演示:

>>> position_of_ngram(['the', 'book'],hyp)
2
>>> 
>>> position_of_ngram(['because', 'he'],hyp)
4

来自@Kasramvd 的解决方案,这是一个使用 NLTK 的 ngrams() 函数的单行答案:

from nltk import ngrams
def position_of_ngram(ngram,sentence):
    return next(i for i, ng in enumerate(ngrams(sentence, len(ngram))) if ng == ngram)

为什么要自己搜索?这就是列表方法 index() 的用途:

def ngram_index(words, ngram):
    return list(nltk.ngrams(words, len(ngram))).index(tuple(ngram))