4

私はPythonが初めてで、必要なことを達成するためのはるかに簡単な方法があると確信していますが、ここに行きます.

inputListと呼ばれる文字のリストに対して頻度分析を実行し、2 文字のペアを取得して別の辞書に追加するプログラムを作成しようとしています。したがって、2 番目の辞書にすべての 2 文字のペアを入力する必要があります。

これを行う方法は大まかにわかっていますが、それを機能させるための構文に少しこだわっています。

for bigram in inputList:
    bigramDict[str(bigram + bigram+1)] =  1

bigram+1 は次の繰り返しの文字です

例として、「stackoverflow」というテキストをinputList入れる場合、最初に文字「st」をキーとして、1 を値として配置する必要があります。2回目の繰り返しでは、キーとして「ta」など。私が抱えている問題は、変数が次の反復に移動せずに次の反復で使用される値を取得することです。

私は自分自身を明確に説明したことを願っています。ご協力いただきありがとうございます

4

4 に答える 4

5

シーケンスの n-gram を取得する簡単な方法は、スライスです。

def ngrams(seq, n=2):
    return [seq[i:i+n] for i in range(len(seq) - n + 1)]

これを組み合わせるとcollections.Counter準備完了です:

from collections import Counter
print Counter(ngrams("abbabcbabbabr"))

ngrams()怠け者になる必要がある場合:

from collections import deque

def ngrams(it, n=2):
    it = iter(it)
    deq = deque(it, maxlen=n)
    yield tuple(deq)
    for p in it:
        deq.append(p)
        yield tuple(deq)

(後者のより洗練されたコードについては、 以下を参照してください)。

于 2012-06-21T22:02:33.560 に答える
3
from collections import Counter
from itertools import islice, izip, tee

def pairs(iterable):
    a, b = tee(iterable)
    for pair in izip(a, islice(b, 1, None)):
        yield pair

print Counter(pairs("stackoverflow"))

または、より単純なバージョン:

def pairs(iterable):
    it = iter(iterable)
    last = next(it)
    for c in it:
        yield last, c
        last = c

任意の一般化されたバージョンn

def ngrams(iterable, n=2):
    return izip(*[islice(it, i, None) for i, it in enumerate(tee(iterable, n))])
于 2012-06-21T22:22:56.323 に答える
3

zip を使用して文字列を圧縮し、それ自体を 1 オフセットしてコピーします

次のようなバイグラフを取得します。

s = "stackoverflow"
zip(s,s[1:])

与えます:

[('s', 't'), ('t', 'a'), ('a', 'c'), ('c', 'k'), ('k', 'o'), ('o', 'v'), ('v', 'e'), ('e', 'r'), ('r', 'f'), ('f', 'l'), ('l', 'o'), ('o', 'w')]

Trigraph も簡単です。

zip(s,s[1:],s[2:])

与えます:

[('s', 't', 'a'), ('t', 'a', 'c'), ('a', 'c', 'k'), ('c', 'k', 'o'), ('k', 'o', 'v'), ('o', 'v', 'e'), ('v', 'e', 'r'), ('e', 'r', 'f'), ('r', 'f', 'l'), ('f', 'l', 'o'), ('l', 'o', 'w')]

タプルを辞書のキーとして使用できます...または、カウントを行うために Counter または default_dict オブジェクトを使用することをお勧めします。幸運を!

于 2012-06-21T22:16:21.447 に答える
1

前の文字の変数を保持しますか? 最初の反復では、最初の文字をフェッチするだけで、他には何もしません。

補遺: このメソッドは、少なくとも、1 つの文字を格納するための単純な変数よりも多くのメモリを浪費する必要はなく、余分なタプルなどもありません。

于 2012-06-21T22:01:52.903 に答える