使用Golang统计文本文件中单词出现次数及单例词

使用Golang统计文本文件中单词出现次数及单例词

本教程详细介绍了如何使用golang高效地统计文本文件中每个单词的出现频率,并从中识别出仅出现一次的“单例词”。文章将通过`bufio.newscanner`逐行读取文件,利用`strings.fields`分割单词,并通过`map[string]int`存储词频,最终提供完整的代码示例和实践指导。

引言:理解文本词频与单例词

在文本处理和自然语言处理领域,统计单词的出现频率是一项基础且重要的任务。通过词频分析,我们可以了解文本的主题、关键词分布。其中,“单例词”(Singleton)特指在文本中仅出现一次的单词,它们有时能揭示文本的独特性或罕见信息。本教程将指导您如何使用Go语言,结合其强大的标准库,高效地实现这一功能。

核心Go语言组件

要实现文本词频统计和单例词识别,我们将主要依赖Go语言的以下核心组件:

bufio.NewScanner: 用于高效地从输入源(如文件、标准输入)读取数据。它能够以行、单词或其他自定义分隔符为单位进行扫描,极大地简化了文件读取操作。strings.Fields: 这是一个便捷的函数,用于将字符串按空白字符(空格、制表符、换行符等)分割成一个字符串切片。它会自动处理多个连续的空白字符,并去除字符串两端的空白。map[string]int: Go语言中的哈希表(或字典),非常适合用于存储键值对。在此场景中,我们将使用它来存储每个单词(string类型)及其对应的出现次数(int类型)。通过yourMap[theWord]++这样的简洁语法,可以方便地更新单词的计数。

实现步骤

整个处理流程可以分为以下几个主要步骤:

打开文件: 获取待处理的文本文件。初始化词频映射: 创建一个空的map[string]int来存储单词计数。逐行读取文件: 使用bufio.NewScanner迭代读取文件的每一行。分割单词: 对每一行文本,使用strings.Fields将其分解为独立的单词。更新词频: 遍历分割出的单词,并在词频映射中更新其计数。识别单例词: 在所有单词处理完毕后,遍历词频映射,找出那些计数为1的单词。

完整代码示例

以下是一个完整的Go程序,演示了如何读取一个文本文件(或标准输入),统计单词频率,并最终识别出所有单例词。

立即学习“go语言免费学习笔记(深入)”;

package mainimport (    "bufio"    "fmt"    "os"    "strings")// countWordFrequencies 统计文本中每个单词的出现频率// 参数 reader 是一个 io.Reader,可以是文件或标准输入// 返回一个 map[string]int,其中键是单词,值是其出现次数func countWordFrequencies(reader *bufio.Scanner) (map[string]int, error) {    frequencyOfWord := make(map[string]int)    for reader.Scan() {        line := reader.Text()        // 将行文本分割成单词        words := strings.Fields(line)        for _, word := range words {            // 可以选择将单词转换为小写,以实现大小写不敏感的计数            // word = strings.ToLower(word)            // 进一步处理标点符号,例如:            // word = strings.Trim(word, ".,!?;:"'()")            frequencyOfWord[word]++ // 增加单词计数        }    }    if err := reader.Err(); err != nil {        return nil, fmt.Errorf("读取输入时发生错误: %w", err)    }    return frequencyOfWord, nil}// findSingletons 从词频映射中找出所有出现次数为1的单词// 参数 frequencyMap 是一个 map[string]int,包含所有单词的频率// 返回一个 []string,包含所有单例词func findSingletons(frequencyMap map[string]int) []string {    var singletons []string    for word, count := range frequencyMap {        if count == 1 {            singletons = append(singletons, word)        }    }    return singletons}func main() {    // 示例:从文件读取    // 假设您有一个名为 "input.txt" 的文件    filePath := "input.txt"    file, err := os.Open(filePath)    if err != nil {        fmt.Fprintf(os.Stderr, "无法打开文件 %s: %vn", filePath, err)        // 如果文件不存在,可以尝试从标准输入读取        fmt.Println("尝试从标准输入读取...")        scanner := bufio.NewScanner(os.Stdin)        wordFrequencies, freqErr := countWordFrequencies(scanner)        if freqErr != nil {            fmt.Fprintf(os.Stderr, "从标准输入读取并计数时发生错误: %vn", freqErr)            os.Exit(1)        }        fmt.Println("n--- 从标准输入读取的词频 ---")        for word, count := range wordFrequencies {            fmt.Printf("'%s': %dn", word, count)        }        singletons := findSingletons(wordFrequencies)        fmt.Println("n--- 从标准输入读取的单例词 ---")        if len(singletons) == 0 {            fmt.Println("没有找到单例词。")        } else {            for _, s := range singletons {                fmt.Println(s)            }        }        os.Exit(0) // 成功处理标准输入后退出    }    defer file.Close() // 确保文件在函数结束时关闭    fmt.Printf("正在处理文件: %sn", filePath)    scanner := bufio.NewScanner(file)    wordFrequencies, freqErr := countWordFrequencies(scanner)    if freqErr != nil {        fmt.Fprintf(os.Stderr, "从文件读取并计数时发生错误: %vn", freqErr)        os.Exit(1)    }    fmt.Println("n--- 词频统计 ---")    for word, count := range wordFrequencies {        fmt.Printf("'%s': %dn", word, count)    }    singletons := findSingletons(wordFrequencies)    fmt.Println("n--- 单例词 ---")    if len(singletons) == 0 {        fmt.Println("没有找到单例词。")    } else {        for _, s := range singletons {            fmt.Println(s)        }    }}

如何运行此示例:

将上述代码保存为 main.go。创建一个名为 input.txt 的文本文件,并填充一些内容,例如:

Hello Go programming language.Go is powerful and simple.Hello world.

在命令行中运行:go run main.go

您将看到程序输出文件中的词频统计和单例词列表。如果 input.txt 不存在,程序会尝试从标准输入读取。

代码解析与注意事项

countWordFrequencies 函数:

闪念贝壳 闪念贝壳

闪念贝壳是一款AI 驱动的智能语音笔记,随时随地用语音记录你的每一个想法。

闪念贝壳 218 查看详情 闪念贝壳 接收一个 *bufio.Scanner 作为参数,这使得函数可以灵活地处理来自文件或标准输入的文本。循环调用 reader.Scan() 来逐行读取输入。Scan() 方法在读取到下一行时返回 true,直到文件结束或遇到错误时返回 false。reader.Text() 获取当前行的字符串内容。strings.Fields(line) 将行分割成单词。例如,”Hello Go” 会被分割成 [“Hello”, “Go”]。frequencyOfWord[word]++ 是Go语言中更新map值的惯用方式。如果word是第一次出现,它会被初始化为0,然后递增到1。reader.Err() 用于检查在 Scan() 循环结束后是否发生了任何错误。

findSingletons 函数:

简单地遍历 frequencyMap,找出所有 count == 1 的单词,并将它们收集到一个字符串切片中。

main 函数:

首先尝试打开名为 input.txt 的文件。这是实际应用中最常见的方式。如果文件打开失败(例如文件不存在),它会回退到从标准输入 (os.Stdin) 读取。这增加了程序的灵活性。defer file.Close() 确保文件句柄在 main 函数结束时被正确关闭,防止资源泄漏。程序打印出完整的词频统计,然后单独列出单例词。

大小写敏感性: 默认情况下,map 的键是大小写敏感的。这意味着 “Go” 和 “go” 会被视为两个不同的单词。如果需要进行大小写不敏感的计数,您可以在更新map之前,使用 word = strings.ToLower(word) 或 word = strings.ToUpper(word) 将单词统一转换为小写或大写。

标点符号处理: strings.Fields 仅根据空白字符进行分割,它不会移除单词内部或末尾的标点符号。例如,”world.” 会被视为一个完整的单词,而不是 “world”。如果您的需求是只统计纯粹的字母单词,您可能需要:

在 word 被添加到 map 之前,使用 strings.Trim(word, “.,!?;:”‘()[]{}”) 等函数移除常见的标点符号。使用正则表达式 (regexp 包) 来提取只包含字母的单词。

内存考虑: 对于非常大的文本文件,如果其中包含大量不同的单词,map[string]int 可能会占用显著的内存。在大多数常见场景下,这并不是问题,但对于GB级别的文本文件和数百万个唯一单词,需要考虑内存优化策略。

总结

通过本教程,您已经掌握了如何使用Go语言及其标准库来高效地统计文本文件中的单词频率,并识别出仅出现一次的单例词。我们利用了bufio.NewScanner进行高效的文件读取,strings.Fields进行单词分割,以及map[string]int进行词频统计。同时,我们还讨论了错误处理、大小写敏感性以及标点符号处理等实践中的重要考虑因素。Go语言简洁的语法和强大的标准库使其成为处理此类文本分析任务的优秀选择。

以上就是使用Golang统计文本文件中单词出现次数及单例词的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/975015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 20:19:53
下一篇 2025年12月1日 20:20:25

相关推荐

  • 十大虚拟币排名最新 十大虚拟币排名下载软件

    2025年十大虚拟货币市值排名依次为:1. 比特币(BTC)作为数字黄金,是去中心化价值存储的代表;2. 以太坊(ETH)支持智能合约与去中心化应用,是DeFi与NFT生态的核心。 本文旨在为加密货币爱好者和新手提供最新的十大虚拟货币市值排名,并推荐一系列安全可靠、功能全面的交易平台软件。通过了解市…

    2025年12月10日
    000
  • 币圈十大交易所app下载地址入口.版本官网.cc

    币安(Binance)是全球交易量最大的加密货币交易所,提供高流动性、丰富的交易对及完整的生态系统,适合各类用户;2. 欧易(OKX)以专业衍生品交易,支持DeFi与NFT操作,适合深度链上用户;3. 火币(HTX)历史悠久,运营稳定,安全性高,在亚洲市场广受信赖。 选择一个安全可靠的加密货币交易所…

    2025年12月10日
    000
  • 什么是SUBBD代币?值得投资吗?SUBBD代币经济学、价格预测介绍

    subbd($subbd)是一个新兴的预售代币项目,支持一个拥有 2.5 亿活跃粉丝的人工智能创作者平台。该平台结合了 web3 与 ai 技术,为内容创作与粉丝互动带来全新方式。目前,投资者可在代币正式上市前,以每枚 0.0551 美元的价格参与预售,抢占早期布局机会。 本文将从多方面分析 $SU…

    2025年12月10日
    000
  • 胖企鹅(PENGU币)怎么样?PENGU币价格预测:近期能到 0.05 美元吗?

    目录 什么是胖企鹅(PENGU)?谁创造了 PENGU?PENGU 如何工作?冰屋公司胖乎乎的企鹅 NFT为何交易 PENGU?PENGU 的用例PENGU代币经济学PENGU 价格预测:看涨势头强劲,目标很快达到 0.05 美元PENGU价格会进一步飙升吗?PENGU 展现出看涨的杯柄形态突破潜力…

    2025年12月10日
    000
  • Ruvi AI:下一个乘上人工智能与区块链浪潮的“雪崩”?

    加密圈总在追逐下一个引爆点,而如今,聚光灯正打在 Ruvi AI(RUVI)身上。这个新兴项目正尝试将人工智能与 Avalanche 区块链深度融合,试图重塑行业规则。它是否具备成为下一个“雪崩级”现象的潜力?我们来深入剖析。 Ruvi AI:核心亮点一览 Ruvi AI 并非空谈概念的普通代币项目…

    2025年12月10日
    000
  • 稳定币最厉害三个公司 稳定币龙头前三名

    Tether(USDT)是市值最高、流动性最强的稳定币,凭借先发优势和广泛交易支持成为市场领导者;2. Circle(USDC)以合规性和透明度为核心,由现金和美债全额支持并接受定期审计,是机构青睐的稳定币。 稳定币作为加密世界与现实世界金融的桥梁,其重要性不言而喻。本文将为您盘点当前稳定币市场中,…

    2025年12月10日
    000
  • 以太坊十周年:从火炬传递到币圈市场狂飙 XBIT解码区块链最新纪元

    以太坊已走过从概念到全球性区块链平台的十年历程,1. 其核心成就是通过智能合约实现可编程区块链,催生DeFi与NFT生态;2. 经历The DAO事件、ICO热潮与“The Merge”向PoS转型,技术与市场并进。 以太坊走过了非凡的十年,从一份革命性的白皮书演变为驱动去中心化金融、nft和web…

    好文分享 2025年12月10日
    000
  • 稳定币市场迎来重大变革 美元稳定币成为最大赢家

    在经历算法稳定币崩溃与监管趋严后,由法币储备支持的美元稳定币因透明度高、合规性强,成为市场最大赢家,其主导地位得以巩固。1. Tether (USDT) 凭借最大市值和广泛流动性,成为全球主流交易所如币安、欧易、火币的核心交易对。 在经历了算法稳定币的崩溃和监管审查的加强后,全球稳定币市场格局正在发…

    2025年12月10日
    000
  • 2025年加密货币市场展望:政策、机构与技术创新如何影响走势?

    2025年加密货币市场将由政策监管清晰化、机构深度参与和技术创新三大因素共同驱动。1. 美国可能出台全面加密法案,全球监管协同(如欧盟MiCA)将提升行业合法性;2. 机构资金将通过比特币及以太坊ETF等合规产品大规模入场,币安、OKX、火币、Gate.io和Coinbase等交易所作为核心基础设施…

    2025年12月10日
    000
  • 比特币将涨至13.1万美元?分析师热议BTC的下一次重大走势

    准备好迎接新一轮行情风暴了吗?比特币正处在关键转折点,多位分析师纷纷上调目标价,预测其可能冲高至13.1万美元甚至逼近14万美元。当前市场情绪高涨,技术形态与宏观走势正成为推动BTC价格上行的核心动力。但问题是:这次能否真正突破关键阻力?还是将再度迎来深度回调? 守住关键支撑,或引爆新一轮上涨 知名…

    2025年12月10日
    000
  • 重力爆破者:NFT、$OYA代币与一个全新的宇宙!

    gravity blasters 正式升级为 oya play,全面引入 nft 机制、支持 $oya 代币,并宣布将于 2025 年 8 月在 steam 平台开启公开测试。全新游戏体验即将震撼登场! 各位游戏爱好者与加密世界探索者注意了!一场颠覆性的进化正在上演——Gravity Blaster…

    2025年12月10日
    000
  • 迷因币狂热:狗狗币、PEPE与加密预售热潮

    迷因币热度降温?揭秘为何投资者正转向blockchainfx与token6900等预售项目,寻找真正价值与高潜力回报。 迷因币生态始终处于快速更迭之中。虽然狗狗币(Dogecoin, DOGE)和PEPE曾掀起热潮,如今越来越多资金开始流向加密货币预售市场,押注那些具备实际功能和长期前景的新项目。以…

    2025年12月10日
    000
  • 2025年 meme 币预测:Pepeto、Doge 和 Pepe 会 dominate 吗?

    2025年pepeto、狗狗币与pepe代币展望:专家预测与投资洞察 2025年迷因币预测:Pepeto、狗狗币与Pepe能否称霸市场? 迷因币热潮持续升温!随着2025年加密市场信心逐步回暖,投资者的关注焦点再度聚焦于三大热门代币——Pepeto、狗狗币(Doge)和Pepe。这三者中,谁最有潜力…

    2025年12月10日
    000
  • Ruvi AI:这款代币是否将迎来雪崩式暴涨?

    最近在加密圈中,一个名为 Ruvi AI(RUVI)的新项目正迅速走红,其发展态势让人不禁联想到 Avalanche 初期的爆发式增长。但这一次,它是否真的能兑现高回报的承诺?还是仅仅另一场短暂的炒作? 安全与透明:构建信任的第一步 在充斥着欺诈与不确定性 的数字资产领域,项目的安全性和透明度尤为关…

    2025年12月10日
    000
  • Cardano生态观察:PayFi代币Remittix能否引发ADA超越?

    remittix(rtx)作为一种payfi代币,是否正准备撼动cardano生态并挑战ada的核心地位?让我们深入剖析正在重塑defi格局的关键趋势与前瞻洞察。 进入2025年,Cardano生态展现出蓬勃生机,但一位新兴力量——Remittix(RTX)已在PayFi赛道强势崛起,或对ADA的统…

    2025年12月10日
    000
  • Solana夏季:开发者活动、迷因币与下一波热潮

    solana 的强势复苏:开发者活跃激增与迷因币狂欢驱动,能否持久?趋势深度解读 Solana 卷土重来了!在经历一段沉寂后,该公链再度焕发活力,币价持续走高,开发社区也愈发热闹。但这波反弹的真正动力来自哪里?是否只是昙花一现?我们来深入拆解 Solana 当前的几大核心动向:开发者生态、迷因币狂热…

    2025年12月10日
    000
  • Pepe美元、Solaxy与模因效用:一位纽约客对加密前沿的见解

    pepe dollar (pepd) 和 solaxy (solx) 正在加密领域掀起一阵风暴。让我们深入剖析这两个新兴项目,揭开它们吸引眼球背后的真正魅力。 嘿,各位加密爱好者!区块链世界从不缺新鲜事,而最近有两个名字频繁刷屏:Pepe Dollar(PEPD)和 Solaxy(SOLX)。它们各…

    2025年12月10日
    000
  • Pepe价格预测:以太坊的上涨推动了青蛙的梦想

    pepe 能否再攀高峰?解读 pepe 价格走势、以太坊联动效应及未来潜力 Pepe 价格前瞻:ETH 上扬点燃“青蛙狂想曲” Pepe 币正借势以太坊强势反弹一路高歌!随着 ETH 近期涨幅逼近 40%,迷因币市场重燃热情,PEPE 是否有望刷新历史高位?一起来看看最新行情预测与关键趋势。 以太坊…

    2025年12月10日
    000
  • 稳定币USDT、USDC、DAI 有何区别?如何选择?

    稳定币是币圈的重要资产锚点,通常与美元等法币1:1挂钩,能帮助用户在市场波动时规避风险。目前主流的稳定币包括 usdt、usdc 和 dai,它们在原理、安全性与应用场景上各有不同。 三种稳定币的主要区别 USDT(Tether):由 Tether 公司发行,是目前市场占比最高的稳定币。它由中心化公…

    2025年12月10日
    000
  • 比特币大幅上涨:纽约人现在应该投资吗?

    比特币的涨势由机构信心推动,现在是投资的正确时机吗?我们深入剖析最新趋势与机遇。 比特币再度成为焦点,价格突破预期并刷新纪录。这是一次短暂的狂欢,还是精明投资者不容错过的良机?让我们一起挖掘此轮上涨的核心动力,并判断你是否该入场参与。 比特币牛市:驱动行情的关键力量是什么? 近期比特币(BTC)一度…

    2025年12月10日
    000

发表回复

登录后才能评论
关注微信