0

個人的な課題として、Pythonで基本的なngram実装を作成します。ユニグラムから始めて、トリグラムまで処理しました。

def unigrams(text):
    uni = []
    for token in text:
        uni.append([token])
    return uni

def bigrams(text):
    bi = []
    token_address = 0
    for token in text[:len(text) - 1]:
        bi.append([token, text[token_address + 1]])
        token_address += 1
    return bi

def trigrams(text):
    tri = []
    token_address = 0
    for token in text[:len(text) - 2]:
        tri.append([token, text[token_address + 1], text[token_address + 2]])
        token_address += 1
    return tri

ここで楽しい部分は、n-gramに一般化することです。ここでのアプローチを一般化する際の主な問題は、appendメソッドに入る長さnのリストを作成することです。最初はラムダがそれを行う方法かもしれないと思っていましたが、その方法がわかりません。

また、私が見ている他の実装は、まったく異なる方法を取っています(驚くことではありません)。たとえば、ここここで、行き止まりになっているのではないかと思い始めています。

このアプローチをあきらめる前に、私は興味があります:1)この方法で任意のリストサイズを作成する1行またはpythonicメソッドはありますか?2)この方法で問題に取り組むことの欠点は何ですか?

4

3 に答える 3

2

次の関数は、一般的なn-gramモデルで機能するはずです。

def ngram(text,grams):  
    model=[]
    # model will contain n-gram strings
    count=0
    for token in text[:len(text)-grams+1]:  
       model.append(text[count:count+grams])  
       count=count+1  
    return model
于 2013-01-31T03:05:05.043 に答える
1

便利なワンライナーとして:

def retrieve_ngrams(txt, n):
    return [txt[i:i+n] for i in range(len(txt)-(n-1))]
于 2014-01-27T17:47:10.627 に答える
0

これを試して。

  def get_ngrams(wordlist,n):
      ngrams = []
      for i in range(len(wordlist)-(n-1)):
          ngrams.append(wordlist[i:i+n])
      return ngrams
于 2020-03-16T10:38:15.307 に答える