HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    如何统计词频(如何统计词频python)

    发布时间:2023-03-24 06:16:02     稿源: 创意岭    阅读: 1061        问大家

    大家好!今天让创意岭的小编来大家介绍下关于如何统计词频的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    创意岭作为行业内优秀企业,服务客户遍布全国,网络营销相关业务请拨打175-8598-2043,或微信:1454722008

    本文目录:

    如何统计词频(如何统计词频python)

    一、如何用python实现英文短文的双词频统计

    简单版:

    #!/usr/bin/env python3

    import re

    import jieba

    from collections import Counter

    fname = 'counttest.txt'

    with open(fname) as f:

        s = f.read()

    pattern = re.compile(r'[a-zA-Z]+-?[a-zA-Z]*')

    english_words = Counter(pattern.findall(s))

    other_words = Counter(jieba.cut(pattern.sub('', s)))

    print('n英文单词统计结果:n'+'-'*17)

    print('n'.join(['{}: {}'.format(i, j) for i, j in english_words.most_common()]))

    print('n中文及符号统计结果:n'+'-'*19)

    print('n'.join(['{}: {}'.format(i, j) for i, j in other_words.most_common()]))

    复杂版:

    #!/usr/bin/env python

    # -*- coding: utf-8 -*-

    from __future__ import print_function, division, unicode_literals

    import sys, re, time, os, jieba

    from collections import Counter

    from datetime import datetime

    class WordCounter(object):

        def __init__(self, from_file, to_file=None, coding=None, jieba_cut=None):

            '''根据设定的进程数,把文件from_file分割成大小基本相同,数量等同与进程数的文件段,

            来读取并统计词频,然后把结果写入to_file中,当其为None时直接打印在终端或命令行上。

            Args:

            @from_file 要读取的文件

            @to_file 结果要写入的文件

            @coding 文件的编码方式,默认为采用chardet模块读取前1万个字符来自动判断

            @jieba_cut 是否启用结巴分词,默认为None

            

            How to use:

            w = WordCounter('a.txt', 'b.txt')

            w.run()        

            '''

            if not os.path.isfile(from_file):

                raise Exception('No such file: 文件不存在')

            self.f1 = from_file

            self.filesize = os.path.getsize(from_file)

            self.f2 = to_file

            if coding is None:

                try:

                    import chardet

                except ImportError:

                    os.system('pip install chardet')

                    print('-'*70)

                    import chardet

                with open(from_file, 'rb') as f:    

                    coding = chardet.detect(f.read(10000))['encoding']            

            self.coding = coding

            self._c = [Counter(), Counter()]

            self.jieba = False

            if jieba_cut is not None:                  

                self.jieba = True

                

        def run(self):

            start = time.time()

            if 1:

                self.count_direct(self.f1)          

            if self.f2 not in ['None', 'Null', 'none', 'null', None]:

                with open(self.f2, 'wb') as f:

                    f.write(self.result.encode(self.coding))

            else:

                print('nEnglish words:n' + '-'*15)

                print(self.result)

            cost = '{:.1f}'.format(time.time()-start)

            size = humansize(self.filesize)

            tip = 'nFile size: {}. Cost time: {} seconds'     

    #        print(tip.format(size, cost))

            self.cost = cost + 's'

        def count_direct(self, from_file):

            '''直接把文件内容全部读进内存并统计词频'''

            start = time.time()

            with open(from_file, 'rb') as f:

                line = f.read()

            for i in range(len(self._c)):

                self._c[i].update(self.parse(line)[i])  

                     

                        

        def parse(self, line):  #解析读取的文件流

            text = line.decode(self.coding)

            text = re.sub(r'-n', '', text) #考虑同一个单词被分割成两段的情况,删除行末的-号

            pattern = re.compile(r'[a-zA-Z]+-?[a-zA-Z]*') #判断是否为英文单词

            english_words = pattern.findall(text)

            rest = pattern.sub('', text)        

            ex = Counter(jieba.cut(rest)) if self.jieba else Counter(text)

            return Counter(english_words), ex

            

        def flush(self):  #清空统计结果

            self._c = [Counter(), Counter()]

        @property

        def counter(self):  #返回统计结果的Counter类       

            return self._c

                        

        @property

        def result(self):  #返回统计结果的字符串型式,等同于要写入结果文件的内容

            ss = []

            for c in self._c:

                ss.append(['{}: {}'.format(i, j) for i, j in c.most_common()])

            

            tip = 'nn中文及符号统计结果:n'+'-'*15+'n'

            return tip.join(['n'.join(s) for s in ss])

    def humansize(size):

        """将文件的大小转成带单位的形式

        >>> humansize(1024) == '1 KB'

        True

        >>> humansize(1000) == '1000 B'

        True

        >>> humansize(1024*1024) == '1 M'

        True

        >>> humansize(1024*1024*1024*2) == '2 G'

        True

        """

        units = ['B', 'KB', 'M', 'G', 'T']    

        for unit in units:

            if size < 1024:

                break

            size = size // 1024

        return '{} {}'.format(size, unit)

            

    def main():

        if len(sys.argv) < 2:

            print('Usage: python wordcounter.py from_file to_file')

            exit(1)

        from_file, to_file = sys.argv[1:3]

        args = {'coding' : None, 'jieba_cut': 1}

        for i in sys.argv:

            for k in args:

                if re.search(r'{}=(.+)'.format(k), i):

                    args[k] = re.findall(r'{}=(.+)'.format(k), i)[0]

        w = WordCounter(from_file, to_file, **args)

        w.run()

        

    if __name__ == '__main__':

        import doctest

        doctest.testmod()

        main()

    更复杂的:如果是比较大的文件,建议采用多进程,详情百度:多进程读取大文件并统计词频 jaket5219999

    二、如何用python对文章中文分词并统计词频

    1、全局变量在函数中使用时需要加入global声明

    2、获取网页内容存入文件时的编码为ascii进行正则匹配时需要decode为GB2312,当匹配到的中文写入文件时需要encode成GB2312写入文件。

    3、中文字符匹配过滤正则表达式为ur'[\u4e00-\u9fa5]+',使用findall找到所有的中文字符存入分组

    4、KEY,Value值可以使用dict存储,排序后可以使用list存储

    5、字符串处理使用split分割,然后使用index截取字符串,判断哪些是名词和动词

    6、命令行使用需要导入os,os.system(cmd)

    三、针对词语在多个文件里该怎么使用TF-IDF计算词频?

    TF-idf算法其实是一种用户资讯检索与资讯探勘的常用加权技术,常常被SEOER们应用到,而很多人或许不太知道,其实最直观的了解就是“网站关键词密度”。

    直接切入主题,TF-idf算法到底是如何计算的:

    公式:

    TF:词频

    IDF:逆文本频率指数

    TF-IDF=TF*IDF

    我们举例说明,TF词频的意思,是指一个词出现在页面中的次数,如果一篇文章的总词语数是200,而“网站优化”这个词出现了4次,那么这个词频TF=4/200,也就是0.02。

    而IDF也就是很文件频率,指这个词在多少页面出现过计数为N,文件总数计数为M,那么IDF=lg(M/N)。假设“网站优化”在2000个页面出现,总文件数为1亿,那么文件频率IDF=lg(100000000/2000)=4.69897,那么计算最后的TF-IDF=0.02*4.69897=0.0939794。

    这只是一个判断一个页面的相关度的问题,而在SEO网站优化中,并不只是判断TF-IDF的值加分,我们需要一个识别度高的词来为页面加分。例如:搜索引擎收录一万亿个页面,应该说每个页面都会有“的、是、中、地、得”等等词,这些高频词也叫噪音词或停止词,搜索引擎会去除这些词,所以这些词的加分权重其实应该是0。计算公式:TF-IDF=log(1万亿/一万亿)=log1=0。

    其实在搜索引擎检索中,计算权重的时候,会根据每个词分词来计算,例如:“SEO网站优化的技巧”这个词。

    假设:SEO页面检索数位2000万,网站优化的检索数为1000万,技巧的检索数为50000万

    搜索引擎索引总数假设为100亿。

    SEO在www.ruihess.com这个网站中页面(页面总词数400)出现8次,网站优化出现10次,技巧出现16次。

    那么各自的词频

    TF(SEO)=8/400=0.02,

    TF(网站优化)=10/400=0.025

    TF(技巧)=20/400=0.04

    TF(的)=上面已近提到,的属于高频停止词,权重为0。

    那么搜索“SEO网站优化的技巧”这个页面的相关度为:TF(总)=0.02+0.025+0.05=0.095。

    而IDF(SEO)=LOG(10000000000/20000000)=2.69897

    IDF(网站优化)= LOG(10000000000/10000000)=3

    IDF(技巧)=log(10000000000/100000000)=1.69897

    这么算下来之后,每个词为搜索“SEO网站优化的技巧”为页面的权重和相关度贡献的值分别为:

    Tf-idf(seo)=0.02*2.69897=0.0539794

    Tf-dif(网站优化)=0.025*3=0.075

    Tf-idf(技巧)=0.04*1.69897=0.0679588

    由此可以看出,虽然技巧出现的频率更高,但识别度没有SEO和网站优化高,所以为页面的权重贡献度并不是太大。

    一个词的预测能力也就是识别度越高,那么这个词的权重越大,反之则越小,看到“网站优化“可能你就已经基本了解这个页面要讲什么,但是看到技巧,你可能还不是太明白页面的主题。

    当然这支持搜索引擎的算法的一个点,我们还要结合标签来实现权重的提升,例如H标签,而主关键词周边的词也会加分,这里周边是指在一个标签内的例如:SEO网站优化的技巧主要是一些搜索引擎优化

    四、如何用python实现英文短文的双词频统计?

    import re

    from itertools import imap as map

    from collections import Counter

    def parserwords(sentence):

        preword = ''

        result = []

        for word in re.findall('w+', sentence.lower()):

            if preword:

                result.append((preword, word))

            preword = word

        return result

    context = """

    Do you hear the people sing, singing a song of angry men. 

    It is the music of a people, who will not be slaves again, 

    when the beating of your heart echoes the beating of the drums. 

    There is a life about to start when tomorrow comes.

    """

    words = []

    for sentence in map(parserwords, 

            re.split(r'[,.]', context.lower())):

        words.extend(sentence)

    prefixcounter = Counter([word[0] for word in words])

    counter = Counter(words)

    meter = {}

    for pre, post in counter.iterkeys():

        meter[(pre, post)] = 1. * counter[(pre, post)] / prefixcounter[pre]

    result = sorted(meter.iteritems(),

        cmp = lambda a, b: cmp(b[1], a[1]) or cmp(a[0], b[0])

        )

    print result[:5]

    以上就是关于如何统计词频相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    小红书怎么付费推广(小红书如何推广自己的内容)

    怎么申请导航位置(导航位置如何申请)

    微信如何解除手机号绑定

    电媒机排行榜(电媒机排行榜最新)

    枪械排行榜