我正在尝试编写一些打印内容的代码,但它会继续打印其他内容。下面是代码,打印内容以及我想要打印的内容。
def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
phoneme_list = phonemes.split()
beam2 = [[['^'],1.0]]
i = 0
for phoneme in phoneme_list:
beam = beam2*len(bigrams[phoneme])
for value in bigrams[phoneme]:
beam[i][0].append(value)
if i == len(beam)-1:
i = 0
else:
i += 1
print(beam)
from collections import defaultdict
bigrams = defaultdict(dict, {'AH': {'u': 0.4, 'l': 0.2, 'ous': 0.2, 'e': 0.2}, 'IH': {'y': 0.16666666666666666, 'i': 0.6666666666666666, 'e': 0.16666666666666666}, 'AE': {'a': 1.0}, 'K': {'c': 0.4, 'x': 0.2, 'q': 0.2, 'ch': 0.2}, 'H': {}, 'G': {'g': 1.0}, 'SH': {'sh': 1.0}, 'Z': {'se': 1.0}, 'AA': {'o': 1.0}, 'JH': {'ge': 1.0}, 'W': {'u': 0.5, 'w': 0.5}, 'V': {'v': 1.0}, 'M': {'me': 0.2, 'm': 0.8}, 'N': {'ne': 0.2, 'n': 0.8}, 'F': {'f': 1.0}, 'B': {'b': 1.0}, 'D': {'de': 0.16666666666666666, 'dd': 0.16666666666666666, 'd': 0.6666666666666666}, 'OW': {'o': 1.0}, 'L': {'l': 0.8333333333333334, 'e': 0.16666666666666666}, 'T': {'te': 0.16666666666666666, 'tt': 0.08333333333333333, 't': 0.75}, 'EH': {'ea': 0.3333333333333333, 'a': 0.3333333333333333, 'e': 0.3333333333333333}, 'S': {'ss': 0.125, '_': 0.25, 's': 0.625}, 'R': {'re': 0.16666666666666666, 'r': 0.8333333333333334}, 'ER': {'or': 0.25, 'er': 0.75}, 'EY': {'ai': 0.2, 'a': 0.8}, 'P': {'p': 1.0}, 'IY': {'y': 0.5, 'e': 0.5}, 'AY': {'i': 1.0}})
trigrams = defaultdict(dict, {('T', 'u'): {'tt': 1.0}, ('S', '^'): {'s': 1.0}, ('D', '^'): {'d': 1.0}, ('K', 'e'): {'x': 1.0}, ('M', '^'): {'m': 1.0}, ('T', 'a'): {'te': 1.0}, ('S', 'x'): {'_': 1.0}, ('T', 'o'): {'t': 1.0}, ('T', 's'): {'t': 1.0}, ('AA', 'm'): {'o': 1.0}, ('IH', '^'): {'i': 0.6666666666666666, 'e': 0.3333333333333333}, ('D', 'n'): {'d': 1.0}, ('B', 'o'): {'b': 1.0}, ('IY', 'f'): {'e': 1.0}, ('K', 'i'): {'c': 1.0}, ('K', '^'): {'c': 0.3333333333333333, 'ch': 0.3333333333333333, 'q': 0.3333333333333333}, ('IH', 't'): {'i': 1.0}, ('S', 'or'): {'s': 1.0}, ('R', 'ch'): {'r': 1.0}, ('D', 'l'): {'d': 1.0}, ('IY', 'r'): {'y': 0.5, 'e': 0.5}, ('IH', 'm'): {'y': 1.0}, ('L', 'c'): {'l': 1.0}, ('EH', 'd'): {'a': 0.5, 'e': 0.5}, ('G', 'o'): {'g': 1.0}, ('V', 'n'): {'v': 1.0}, ('AE', 's'): {'a': 1.0}, ('S', 'y'): {'s': 1.0}, ('OW', 'r'): {'o': 1.0}, ('L', 'e'): {'l': 1.0}, ('N', 'i'): {'ne': 0.3333333333333333, 'n': 0.6666666666666666}, ('OW', 'l'): {'o': 1.0}, ('Z', 'n'): {'se': 1.0}, ('ER', 'm'): {'er': 1.0}, ('P', '^'): {'p': 1.0}, ('IH', 'u'): {'i': 1.0}, ('R', 'a'): {'re': 1.0}, ('R', '^'): {'r': 1.0}, ('T', 'e'): {'t': 1.0}, ('L', 'l'): {'e': 1.0}, ('EY', 't'): {'ai': 0.5, 'a': 0.5}, ('AY', 'l'): {'i': 1.0}, ('EY', 'b'): {'a': 1.0}, ('IY', 't'): {'y': 1.0}, ('ER', 'n'): {'er': 1.0}, ('OW', '^'): {'o': 1.0}, ('M', 'o'): {'me': 1.0}, ('S', 'u'): {'s': 1.0}, ('OW', 'g'): {'o': 1.0}, ('W', 'q'): {'u': 1.0}, ('T', '^'): {'t': 1.0}, ('S', 'ous'): {'_': 1.0}, ('AH', 'b'): {'u': 1.0}, ('EH', 'l'): {'ea': 1.0}, ('OW', 'm'): {'o': 1.0}, ('M', 'e'): {'m': 1.0}, ('EY', 'v'): {'a': 1.0}, ('EY', 'p'): {'a': 1.0}, ('AH', 'er'): {'ous': 1.0}, ('JH', 'er'): {'ge': 1.0}, ('ER', 'tt'): {'er': 1.0}, ('R', 't'): {'r': 1.0}, ('L', '^'): {'l': 1.0}, ('B', 'e'): {'b': 1.0}, ('SH', '^'): {'sh': 1.0}, ('ER', 'w'): {'or': 1.0}, ('W', '^'): {'w': 1.0}, ('T', 'i'): {'t': 1.0}, ('L', 'o'): {'l': 1.0}, ('B', '^'): {'b': 1.0}, ('F', '^'): {'f': 1.0}, ('AH', 'r'): {'u': 1.0}, ('L', 'ai'): {'l': 1.0}, ('N', 'ea'): {'n': 1.0}, ('AH', 'dd'): {'l': 1.0}, ('S', 'a'): {'ss': 0.5, 's': 0.5}, ('AH', 'd'): {'e': 1.0}, ('N', 'o'): {'n': 1.0}, ('AE', 'b'): {'a': 1.0}, ('AA', 'sh'): {'o': 1.0}, ('D', 'a'): {'de': 0.5, 'dd': 0.5}})
speech2text("M IH T", bigrams, trigrams, alpha=0.5)
这是打印的内容
[[['^', 'm'], 1.0], [['^', 'm'], 1.0]]
[[['^', 'm', 'me'], 1.0], [['^', 'm', 'me'], 1.0]]
...... and so on
这是我想要打印的内容
[[['^', 'm'], 1.0], [['^', 'me'], 1.0]]
...... and so on
基本上,为什么将该术语附加到两个列表中?我认为它与beam和beam2'指向'同一列表的事实有关,我尝试制作beam2 = beam2 * len(bigrams [phoneme])然后beam = list(beam2),我相信这使得它们指向内存中的两个单独的列表,但可能不是?
感谢您的帮助
编辑:
所以在Gassa的一些帮助之后,我的代码现在看起来像这样但我有一个新问题:
def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
phoneme_list = phonemes.split()
beam2 = [[['^'],1.0]]
i = 0
for phoneme in phoneme_list:
beam = [[[['^'],1.0]] for k in range (len(bigrams[phoneme]))]
for value in bigrams[phoneme]:
beam[i][0].append(value)
if i == len(beam)-1:
i = 0
else:
i += 1
beam2 = beam
print(beam2)
这里打印的beam2包含两组,然后是三组,然后是三组,当我真的需要它包含两组,然后是六组,然后是18组。哪个适用于此代码:
def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
phoneme_list = phonemes.split()
beam2 = [[['^'],1.0]]
i = 0
for phoneme in phoneme_list:
beam = [beam2 for k in range (len(bigrams[phoneme]))]
for value in bigrams[phoneme]:
beam[i][0].append(value)
if i == len(beam)-1:
i = 0
else:
i += 1
beam2 = beam
print(beam2)
但当然我们回到原来的问题。
再次感谢您的帮助!
答案 0 :(得分:1)
该行
beam = beam2*len(bigrams[phoneme])
将列表梁作为len(bigrams[phoneme])
引用创建到同一个列表beam2[0]
。
您可以改为使用像
这样的行beam = [[['^'],1.0] for k in range (len(bigrams[phoneme]))]
请注意,不再使用beam2
。
这样,您就可以获得输出
[[['^', 'me'], 1.0], [['^'], 1.0]]
[[['^', 'me'], 1.0], [['^', 'm'], 1.0]]
...
这不完全是您想要的,但至少beam
的内容现在是不同的列表。
编辑: 至于问题的第二部分,这段代码似乎可以做你想要的:
def speech2text(phonemes, bigrams, trigrams, alpha, topn=10):
phoneme_list = phonemes.split()
beam2 = [[['^'],1.0]]
i = 0
for phoneme in phoneme_list:
beam = [copy.deepcopy (j) for j in beam2 for k in range (len(bigrams[phoneme]))]
for j in range (len (beam2)):
for value in bigrams[phoneme]:
beam[i][0].append(value)
if i == len(beam)-1:
i = 0
else:
i += 1
beam2 = beam
print(beam2)
copy.deepcopy部分确保列表中的所有列表都被正确复制,您不必自己处理复制。
for j in beam2 for k in range
部分是将所有内容放入同一列表中,而不是列表列表。
新的for j in range (len (beam2)):
部分是将您的更改应用于整个光束,而不仅仅是其前缀。