4

我对 Python 很陌生,我确信有一种更简单的方法来完成我需要的东西,但这里就可以了。

我正在尝试创建一个程序,该程序对调用的字母列表执行频率分析,inputList并检索这两个字母对并将它们添加到另一个字典中。所以我需要它来填充所有 2 个字母对的第二个字典。

我有一个粗略的想法,我该如何做到这一点,但我有点坚持使用语法来使它工作。

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

其中 bigram+1 是下一次迭代中的字母

例如,如果我要在其中包含文本“stackoverflow”,inputList我需要首先将字母“st”作为键,将 1 作为值。在第二次迭代中,“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

使用 zip 压缩字符串以复制自身偏移 1

得到这样的bigraph:

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')]

三元组也很简单:

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 回答
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 回答
1

保留前一个字母的变量?第一次迭代你只取第一个字母,什么都不做。

附录:这种方法至少不需要浪费更多的内存,而不是一个简单的变量来存储一个字母,没有多余的元组或任何东西。

于 2012-06-21T22:01:52.903 回答