在字符串中创建单词字典,其值是该单词后面的单词

时间:2016-08-15 03:38:14

标签: python dictionary word-count

我想从文本文件中创建一个字典,使用每个唯一的单词作为键,以及键后面的单词的字典,并将该单词的计数作为值。例如,看起来像这样:

>>>string = 'This is a string'
>>>word_counts(string)
{'this': {'is': 1}, 'is': {'a': 1}, 'a': {'string': 1}}

创建一个独特单词的字典是没有问题的,它正在为我坚持的下面的单词值创建字典。如果有重复的单词,我不能使用list.index()操作。除此之外,我有点不知所措。

3 个答案:

答案 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 docspairwise食谱,或者,如果您使用的是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}}