微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于单词对共现计数的高效Python?

我想要一种有效的Pythonic方法来计算文本中的相邻单词对.高效,因为它需要更好地处理更大的数据集.

计数的方式也很重要.

考虑这个简化的例子:

words_list = "apple banana banana apple".split()

我可以创建邻近对使用:

word_pair_list = zip(words_list[:-1], words_list[1:])

然后我可以用Python来计算它们

word_pair_ctr = collections.Counter(word_pair_list)

这给了我

(('apple', 'banana'), 1)
(('banana', 'banana'), 1)
(('banana', 'apple'), 1)

请注意,’apple’和’apple’不是相邻的一对.

但我希望对的顺序不计算在内.这意味着(‘apple’,’banana’)和(‘banana’,’apple’)应该被认为是相同的,并且计数应该是

(('apple', 'banana'), 2)
(('banana', 'banana'), 1)

我找不到这样做的Pythonic方法,不需要我访问单词列表中的每个项目,这对于较大的文本来说效率低下.

我很高兴使用常见的scipy,numpy和pandas作为库.

解决方法:

您可以使用官方文档(https://docs.python.org/3.8/library/itertools.html)中的成对函数修改版本,以便按对读取列表,同时重新排序每对成员:

l = "apple banana banana apple".split()
def pairwise(iterable):
    """s -> (s0,s1), (s1,s2), (s2, s3), ..."""
    a, b = itertools.tee(iterable)
    next(b, None)
    return ((a, b) if a < b else (b, a) for a, b in zip(a, b))
>>> list(pairwise(l))
<class 'list'>: ['apple', 'banana', 'banana', 'apple']
>>> collections.Counter(pairwise(l))
Counter({('apple', 'banana'): 2, ('banana', 'banana'): 1})

希望这可以帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐