我无法弄清楚这背后的逻辑。
1。)首先,我从这个文本文件中读取了一个剥去标点符号和空格的文本文件:
The sun is bright & the moon glows.
The dog barks while the cat meows.
My dog is dark, dark as crows.
2。)读完这个文本文件之后,我想假设有一个字典,其中一个单词作为键,而下一个单词作为值,如下所示:
{'the':['sun','moon','dog','cat'], 'sun':['is'], 'is':['bright','dark'], 'moon':['glows'],'glows':['the'],
'dog':['barks','is'], 'barks':['while'],'while':['the'], 'cat':['meows'],'meows':['my'], 'my':['dog'],
'dark':['dark','as'], 'as':['crows'],
'bright':['the'], 'crows':[]}
最后两项是特殊情况。 "crows"
有一个空列表,因为它是文本文件中的最后一个单词。
我不确定这背后的逻辑,但我似乎无法理解这一点。
我的第一个方法是创建一个包含所有单词的巨型列表,从列表中挑选和拉出以形成几个较小的列表。
答案 0 :(得分:1)
你可以链接一些字符串转换来摆脱标点符号,然后在转换为小写(text-opener.py
vs The
)之后拆分字符串。
然后,将单词列表与相同列表的移位副本交错并迭代它。
将值附加到词典元素,因此key是当前单词,value是后面单词的列表。问题是the
在列表中不存在。所以手动添加最后一个单词。
crows
结果:
from collections import defaultdict
import string
s = "The sun is bright & the moon glows. The dog barks while the cat meows. My dog is dark, dark as crows."
s = s.translate({ord(x):None for x in string.punctuation}).lower().split()
c = defaultdict(list)
for cw,nw in zip(s,s[1:]):
c[cw].append(nw)
c[s[-1]] = [] # last word of the sentence, special case
print(c)
答案 1 :(得分:1)
您可以使用open
和.read
with open(filename, 'r') as f:
astr = f.read()
首先,您需要规范化输入。这意味着替换您要忽略的字符并删除不良字符:
# lowercase the string
astr = astr.lower()
# remove to-be-ignored characters
for badchar in '&,.':
astr = astr.replace(badchar, '')
下一步是按空格分割输入然后获取单词和下一个单词并将其附加到字典中。
result = {}
words = astr.split()
# only iterate until length - 1 because the last word in each
# sentence has no next word.
for i in range(len(words) - 1):
result.setdefault(words[i], []).append(words[i+1])
result.setdefault(words[-1], [])
给出了:
print(result)
{'as': ['crows'],
'barks': ['while'],
'bright': ['the'],
'cat': ['meows'],
'crows': [],
'dark': ['dark', 'as'],
'dog': ['barks', 'is'],
'glows': ['the'],
'is': ['bright', 'dark'],
'meows': ['my'],
'moon': ['glows'],
'my': ['dog'],
'sun': ['is'],
'the': ['sun', 'moon', 'dog', 'cat'],
'while': ['the']}