自然语言理解 之 统计词频

统计词频,中文字体编码格式:GB2312。

  1 #include <iostream>
  2 #include <fstream>
  3 #include <algorithm>
  4 #include <functional>
  5 #include <string>
  6 #include <vector>
  7 #include <map>
  8 #include <unordered_map>
  9 #include <sstream>
 10 #include <ctime>
 11 using namespace std;
 12
 13 typedef long clock_t;
 14 typedef pair<string, int> Pair_StrInt;
 15 typedef string::iterator StrItr;
 16 typedef vector<Pair_StrInt>::iterator Vec_Pair_StrInt_Itr;
 17 #define ERROR0 cerr << "Open error !!!" << endl; exit(1);
 18 #define ERROR1 cerr << "无法识别 !!!" << endl; exit(1);
 19 #define Lim 100
 20
 21 string infile = "Ci.txt";
 22 string outfile1 = "out1.txt";
 23 string outfile2 = "out2.txt";
 24 string outfile3 = "out3.txt";
 25 string project_time = "project_time.txt";
 26 string One_strArr[100];
 27 string Two_strArr[100];
 28 string Three_strArr[100];
 29 ifstream fin;
 30 ofstream fout;
 31 string Text;
 32
 33 struct myNode {
 34     string Chant; // 词牌名
 35     string Rules; // 格式
 36 };
 37
 38 bool Pair_StrInt_Cmp(const Pair_StrInt& p0, const Pair_StrInt& p1) { return (p0.second > p1.second); }
 39 unordered_map<string, int> StrInt_Hash;
 40
 41 void InitText(string _infile) {
 42     fin.open(_infile);
 43     if (!fin) { ERROR0; }
 44
 45     //////////////////////////////////////////////////////////////////////////
 46     // 将整个文件读入 string : 流迭代器
 47     std::ostringstream tmp;
 48     tmp << fin.rdbuf();
 49     string Text_tmp = tmp.str();
 50     //////////////////////////////////////////////////////////////////////////
 51
 52     StrItr str_itr;
 53     string strTmp;
 54     unsigned char Judge;
 55
 56     for (str_itr = Text_tmp.begin(); str_itr != Text_tmp.end();) {
 57         Judge = (*str_itr);
 58         if (Judge >= 0xB0 && Judge <= 0xF7) {
 59             strTmp = "";
 60             strTmp += (*str_itr);
 61             strTmp += (*(str_itr + 1));
 62             str_itr += 2;
 63             Text += strTmp;
 64         }
 65         else { ++str_itr; }
 66
 67     }
 68
 69     fin.close();
 70     fin.clear();
 71 }
 72
 73 // 输出到文件
 74 void myOutput(const vector<Pair_StrInt> &StrInt_Vec, string out) {
 75     fout.open(out);
 76     if (!fout) { ERROR0; }
 77
 78     vector<Pair_StrInt>::const_iterator pair_itr;
 79     for (pair_itr = StrInt_Vec.begin(); pair_itr != StrInt_Vec.end(); ++pair_itr) {
 80         fout << pair_itr->first << "\t" << pair_itr->second << endl;
 81     }
 82
 83     fout.close();
 84     fout.clear();
 85 }
 86
 87 // 获取一个中文字的词频
 88 void getOneWord(string out1) {
 89     string strTmp;
 90
 91     int str_len = Text.size();
 92     for (int i = 0; i < str_len; i += 2) {
 93         strTmp = Text.substr(i, 2);
 94         StrInt_Hash[strTmp] += 1;
 95     }
 96
 97     vector<Pair_StrInt> StrInt_Vec(StrInt_Hash.begin(), StrInt_Hash.end());
 98     StrInt_Hash.clear();
 99     std::sort(StrInt_Vec.begin(), StrInt_Vec.end(), Pair_StrInt_Cmp);
100
101     myOutput(StrInt_Vec, out1);
102
103     StrInt_Vec.clear();
104 }
105
106 // 获取两个中文字的词频
107 void getTwoWord(string out2) {
108     string strTmp;
109
110     int str_len = Text.size();
111     for (int i = 0; i < (str_len - 2); i += 2) {
112         strTmp = Text.substr(i, 4);
113         StrInt_Hash[strTmp] += 1;
114     }
115
116     vector<Pair_StrInt> StrInt_Vec(StrInt_Hash.begin(), StrInt_Hash.end());
117     StrInt_Hash.clear();
118     std::sort(StrInt_Vec.begin(), StrInt_Vec.end(), Pair_StrInt_Cmp);
119
120     myOutput(StrInt_Vec, out2);
121
122     StrInt_Vec.clear();
123 }
124
125 // 获取三个中文字的词频
126 void getThreeWord(string out3) {
127     string strTmp;
128
129     int str_len = Text.size();
130     for (int i = 0; i < (str_len - 4); i += 2) {
131         strTmp = Text.substr(i, 6);
132         StrInt_Hash[strTmp] += 1;
133     }
134
135     vector<Pair_StrInt> StrInt_Vec(StrInt_Hash.begin(), StrInt_Hash.end());
136     StrInt_Hash.clear();
137     std::sort(StrInt_Vec.begin(), StrInt_Vec.end(), Pair_StrInt_Cmp);
138
139     myOutput(StrInt_Vec, out3);
140
141     StrInt_Vec.clear();
142 }
143
144 // 自动生成词
145 void Poetry(string _strTmp) {
146     int len = _strTmp.size();
147     int myRandom;
148     srand((unsigned)(time(NULL)));
149     for (int i = 0; i < len; ++i) {
150         switch (_strTmp[i])
151         {
152         case ‘2‘: {
153             myRandom = rand() % Lim;
154             cout << Two_strArr[myRandom];
155             break;
156         }
157         case ‘1‘: {
158             myRandom = rand() % Lim;
159             cout << One_strArr[myRandom];
160             break;
161         }
162         case ‘3‘: {
163             myRandom = rand() % Lim;
164             cout << Three_strArr[myRandom];
165             break;
166         }
167         case ‘0‘: {
168             cout << ‘\n‘;
169             break;
170         }
171         case ‘-‘: {
172             cout << "  ";
173             break;
174         }
175         default: {
176             cout << _strTmp.substr(i, 2);
177             ++i;
178             break;
179         }
180         }
181     }
182     cout << endl;
183 }
184
185 // 生成词前的预处理
186 void makePoetry(string out1, string out2, string out3) {
187     ifstream fin1, fin2, fin3;
188     ofstream fout1, fout2, fout3;
189     fin1.open(out1);
190     if (!fin1) { ERROR0; }
191     fin2.open(out2);
192     if (!fin2) { ERROR0; }
193     fin3.open(out3);
194     if (!fin3) { ERROR0; }
195     string strTmp;
196     for (int i = 0; i < Lim; ++i) {
197         getline(fin1, strTmp);
198         One_strArr[i] = strTmp.substr(0, 2);
199         getline(fin2, strTmp);
200         Two_strArr[i] = strTmp.substr(0, 4);
201         getline(fin3, strTmp);
202         Three_strArr[i] = strTmp.substr(0, 6);
203     }
204
205     myNode node0;
206     node0.Chant = "念奴娇";
207     node0.Rules = "·220-22,12,222。22,21:222。22,22,23。22,222。0-222,23,22。22,3222。22,23,22。22,222。0";
208
209     string strTmp0 = "---" + node0.Chant + node0.Rules;
210     Poetry(strTmp0);
211     system("pause");
212 }
213
214 void Solve() {
215
216     InitText(infile);
217
218     ofstream fout;
219     fout.open(project_time);
220     clock_t myStart, myFinish;
221     double totaltime;
222     //////////////////////////////////////////////////////////////////////////
223     myStart = clock();
224     //////////////////////////////////////////////////////////////////////////
225     getOneWord(outfile1);
226     //////////////////////////////////////////////////////////////////////////
227     getTwoWord(outfile2);
228     /////////////////////////////////////////////////////////////////////////
229     getThreeWord(outfile3);
230     //////////////////////////////////////////////////////////////////////////
231
232     myFinish = clock();
233     totaltime = (double)(myFinish - myStart) / CLOCKS_PER_SEC;
234
235     fout << "运行时间为: " << totaltime << " 秒。" << endl;
236     fout.close();
237     fout.clear();
238
239
240     makePoetry(outfile1, outfile2, outfile3);
241 }
242
243 int main() {
244     Solve();
245     return 0;
246 }
时间: 2024-12-10 04:05:45

自然语言理解 之 统计词频的相关文章

自然语言理解——数学基础

一.信息论基础: 熵: 联合熵:实际上就是描述一对随机变量平均所需要的信息量. 条件熵:给定随机变量 X 的情况下,随机变量 Y 的条件熵定义为: 熵率: 相对熵(KL距离):两个概率分布 p(x) 和 q(x) 的相对熵定义为: 交叉熵:如果一个随机变量 X ~ p(x),q(x)为用于近似 p(x)的概率分布,那么,随机变量 X 和模型 q 之间的交叉熵定义为: 由此,我们可以根据模型 q 和一个含有大量数据的 L 的样本来计算交叉熵.在设计模型 q 时,我们的目的是使交叉熵最小,从而使模型

机器学习: 专家系统、认知模拟、规划和问题求解、数据挖掘、网络信息服务、图象识别、故障诊断、自然语言理解、机器人和博弈等领域。

机器学习 编辑 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能. 它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳.综合而不是演绎. 中文名 机器学习 外文名 Machine Learning

自然语言理解——introduction

1.基本概念: NLP:自然语言处理是研究如何利用计算机技术对语言文本(句子.篇章或话语等)进行处理和加工的一门学科,研究内容包括对词法.句法.语义和语用等信息的识别.分类.提取.转换和生成等各种处理方法和实现技术. 语言的基本属性:语音和文字 2.研究内容: 3.基本问题: a)形态学(morphology)问题:研究词(word) 由有意义的基本单位-词素(morphemes)的构成问题.单词的识别/ 汉语的分词问题.词素:词根.前缀.后缀.词尾. b)语法学(syntax)问题:研究句子结

自然语言理解——NLP中的形式语言自动机

1.形式语言:是用来精确地描述语言(包括人工语言和自然语言)及其结构的手段.形式语言学 也称代数语言学. 2.自动机:识别器是有穷地表示无穷语言的另一种方法.每一个语言的句子都能被一定的识别器所接受. *有限状态转换机(FST) 除了前面提到的单词拼写检查.词法分析.词性标注等工作以外,有限状态自动机还广泛地应用于句法分析.短语识别.机器翻译和语音识别等很多方面. 自然语言理解--NLP中的形式语言自动机,布布扣,bubuko.com

C++回顾 统计词频问题 -- vector、map、hash_map(三种方式时间比较)

本博文我们通过三个程序比较统计词频问题的时间复杂度问题: 问题描述; 1).找一篇文章,将所有单词输入至程序:(The Bible Holy为例) 2).统计出每个单词的数量,即词频问题: 3).增加停用词功能:(遇到此类词,直接略过)(网上搜) 4).分别统计出读取文件并计算词频时间.排序所用时间: 5).用 类 实现各函数(处统计时间的函数除外). vector.map.hash_map 都要处理字符串的 去除标点符号.将大写字母转换成小写字母.不对数字进行统计 问题.因此,我们可以将处理这

Excel中COUNTIFS函数统计词频个数出现次数

Excel中COUNTIFS函数统计词频个数出现次数 在Excel中经常需要实现如下需求:在某一列单元格中有不同的词语,有些词语相同,有的不同(如图1所示).需要统计Excel表格中每个词语出现的个数,即相当于统计词频出现次数. 图1. Excel表格统计个数 解决方法:采用COUNTIFS函数. COUNTIFS 函数语法及格式:COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2]…)其中,criteria_rang

从研究到应用:腾讯AI Lab的自然语言理解和生成

3月16日在腾讯AILab第二届学术论坛上,腾讯AI Lab高级研究员李菁博士介绍了实验室目前在NLP方面重点关注的两大方向--如何理解和生成自然语言,并介绍了实验室的相关研究和应用成果. 自然语言的理解 自然语言理解的目标是使得机器能够像人一样进行阅读.机器不能像人一样通过直觉和感知来理解文本,只能通过计算和逻辑.因此,自然语言的理解需要通过表征学习(Representation Learning)的手段把文本信号转化为比如向量.矩阵等等可计算的形式.然后通过信息抽取(Information

[学习记录]NLTK常见操作一(去网页标记,统计词频,去停用词)

NLTK是python环境中的一个非常流行的NLP库,这篇记录主要记录NLTK的一些常见操作 1.去除网页html标记 我们常常通过爬虫获取网页信息,然后需要去除网页的html标签.为此我们可以这么做: 2.统计词频 这里使用的tokens就是上面图中的tokens 3.去除停用词 停用词就是类似the,a,of这种语义无价值的词,取出后我们还可以把统计图画出来 4.绘制词云图 对于词云图的使用原理还不太清楚,只是找了一个可运行的公式 原文地址:https://www.cnblogs.com/t

python进行分词及统计词频

#!/usr/bin/python # -*- coding: UTF-8 -*- #分词统计词频 import jieba import re from collections import Counter content="" filename=r"../data/commentText.txt"; result = "result_com.txt" r='[0-9\s+\.\!\/_,$%^*()?;::-[]+\"\']+|[+