有没有办法在句子中找到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”相比,这是否更快?
答案 0 :(得分:3)
为什么要打扰自己?这就是列表方法index()
的用途:
def ngram_index(words, ngram):
return list(nltk.ngrams(words, len(ngram))).index(tuple(ngram))
答案 1 :(得分:1)
您可以使用函数循环单词列表的切片:
>>> 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
答案 2 :(得分:1)
来自@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)