所以,我有一个术语词典,其中每个键都是文本文件中的一个词,该值是该文本文件中接下来两个词的列表。
def dict(txt, n):
txt = txt.split()
output = {}
for i in range(len(txt)-n+1):
t = ' '.join(txt[i:i+1])
p = text[i+1:i+n]
output.setdefault(t, 0)
output[t] = p
return output
输出是一个字典:
{'had':['a','little'], 'Mary':['had','a'], 'a': ['little', 'lamb.']}
(我的实际上要长得多,因为它正在分析一篇长篇论文。)
我的问题是,如何通过读取密钥,然后打印值,然后读取最后一个值,然后找到与该值匹配的密钥,将这些术语重新连接在一起。目标是最终获得一个随机段落,使用大型文档提供。
到目前为止,我有以下几点:
if output[t] == text[1]:
return output
print(output.join(' ')
但这并不能归还任何东西。建议?
答案 0 :(得分:0)
Python' join
可能不像您期望的那样工作。
你在想你写的
collection.join(join_character)
但它是
join_character.join(collection)
您应该期望编写像
这样的代码' '.join(output)
output
你究竟需要什么取决于你;我希望你能把这部分搞清楚。看起来您在这里错误地使用了join
。
答案 1 :(得分:0)
这将添加条款,直到dic
不包含key
。
dic = {'had': ['a', 'little'], 'Mary': ['had', 'a'], 'a': ['little', 'lamb.']}
key = 'Mary'
res = []
while True:
try:
res.extend(dic[key])
key = dic[key][-1]
except KeyError:
break
print ' '.join(res)
这会产生:
['had', 'a', 'little', 'lamb.']
请注意:如果所有值也是键,您将进入无限循环。如果字典中有重复序列,您也会遇到此问题,例如
{'a': ['b', 'c'], 'b': ['a', 'c'], 'c': ['a', 'b'], 'foo': ['bar', 'foobar']}
为了避免这种情况,你可以做两件事中的一件:
最大迭代次数值
dic = {'had': ['a', 'little'], 'Mary': ['had', 'a'], 'a': ['little', 'lamb.']}
key = 'Mary'
res = []
max_iterations = 10
i = 0
while i < max_iterations
try:
res.extend(dic[key])
key = dic[key][-1]
except KeyError:
break
i += 1
if i > max_iterations:
break
print ' '.join(res)
停在先前看到的密钥
dic = {'had': ['a', 'little'], 'Mary': ['had', 'a'], 'a': ['little', 'lamb.']}
key = 'Mary'
res = []
seen_keys = []
while True:
if key in seen_keys:
break
try:
res.extend(dic[key])
seen_keys.append(key)
key = dic[key][-1]
except KeyError:
break
print ' '.join(res)
答案 2 :(得分:0)
您的数据结构dict['word1'] = ('word2', 'word3')
要求您搜索数据值,效率非常低。
如果将其组织为dict[('word1', 'word2')] = ['possible', 'word3', 'values']
,将会更容易查找。
from itertools import tee, izip
from collections import defaultdict
from random import choice
def triwise(iterable):
a,b,c = tee(iter(iterable), 3)
next(b, None)
next(c, None)
next(c, None)
return izip(a, b, c)
def make_lookup(txt):
res = defaultdict(list)
words = ['', ''] + txt.strip().split() + ['', '']
for w1, w2, w3 in triwise(words):
res[(w1, w2)].append(w3)
return dict(res)
def make_sentence(lookup):
w1, w2 = '', ''
words = []
while True:
w1, w2 = w2, choice(lookup[(w1, w2)])
if w2 == '':
return ' '.join(words)
else:
words.append(w2)
def main():
txt = 'Mary had a little lamb whose fleece was white as snow'
lookup = make_lookup(txt)
print(make_sentence(lookup))
if __name__=="__main__":
main()