我想从文本文件中创建一个字典,使用每个唯一的单词作为键,以及键后面的单词的字典,并将该单词的计数作为值。例如,看起来像这样:
>>>string = 'This is a string'
>>>word_counts(string)
{'this': {'is': 1}, 'is': {'a': 1}, 'a': {'string': 1}}
创建一个独特单词的字典是没有问题的,它正在为我坚持的下面的单词值创建字典。如果有重复的单词,我不能使用list.index()操作。除此之外,我有点不知所措。
答案 0 :(得分:2)
实际上,collections.Counter
课程并不总是最好的选择。您可以使用collections.defaultdict
:
from collections import defaultdict
def bigrams(text):
words = text.strip().lower().split()
counter = defaultdict(lambda: defaultdict(int))
for prev, current in zip(words[:-1], words[1:]):
counter[prev][current] += 1
return counter
请注意,如果您的文字也包含标点符号,则行words = text.strip().lower().split()
应替换为words = re.findall(r'\w+', text.lower())
。
如果您的文字非常庞大且性能很重要,您可以考虑来自itertools
docs的pairwise
食谱,或者,如果您使用的是python2,itertools.izip
代替zip
{1}}。
答案 1 :(得分:1)
您可以利用Counter
来实现您的目标:
class CustomShrinkToCenterSegue: UIStoryboardSegue {
override func perform()
{
let sourceVC = self.sourceViewController
let destinationVC = self.destinationViewController
sourceVC.view.addSubview(destinationVC.view)
destinationVC.view.transform = CGAffineTransformMakeScale(1, 1)
UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseInOut, animations: { () -> Void in
destinationVC.view.transform = CGAffineTransformMakeScale(0.05, 0.05)
}) { (finished) -> Void in
destinationVC.view.removeFromSuperview()
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue()) {
sourceVC.presentViewController(destinationVC, animated: false, completion: nil)
}
}
}
}
答案 2 :(得分:0)
只是提供一个替代选项(我想其他答案更适合您的需求)您可以使用pairwise
中的itertools
食谱:
from itertools import tee, izip
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
然后该函数可以编码为:
def word_counts(string):
words = string.split()
result = defaultdict(lambda: defaultdict(int))
for word1, word2 in pairwise(words):
result[word1][word2] += 1
return result
测试:
string = 'This is a string is not an int is a string'
print word_counts(string)
产地:
{'a': {'string': 2}, 'string': {'is': 1}, 'This': {'is': 1}, 'is': {'a': 2, 'not': 1}, 'an': {'int': 1}, 'int': {'is': 1}, 'not': {'an': 1}}