黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

統計英文文本中的詞頻

系統 2391 0

  NLP的文本分類過程中,大多會統計文章的詞頻,這是分類的重要依據之一。詞頻是由一個pair組成的,word是key

frequece是value。用什么方法統計最好,當然是map。用vector,list也可以實現,但是它們基于關鍵字的檢索效率沒有

map高,map一般是用rb-Tree實現的,查找效率是O(log(n)),list,vector都是線性的,查找復雜度是O(n)。

  先上代碼。

?

header
        
#ifndef _WORD_FREQUENCE_
#define _WORD_FREQUENCE_
#include
< map >
#include
< iostream >
#include
< string >
using std::map;
class WordFrequence{
public :
WordFrequence(): file_name_(NULL){}
WordFrequence(
char * file_name): file_name_(file_name){
LoadFromFile();
ReplaceSymbol();
parse();
}
private :
char * file_name_;
char * text;
map
< std:: string , int > word_frequence_map_;
void parse();
void ReplaceSymbol();
void LoadFromFile();
bool IsWhiteChar( const char chr);
friend std::ostream
& operator << (std::ostream & os, const WordFrequence & wf);
};
#endif

?

?

?

?

cpp
        
#include " word_frequence.h "
#include
< string >
#include
< iostream >
#include
< fstream >
#include
< map >

const char * symbols = " ~!@#$%^&*()_+-=[]\\{}|:\ " ; ' ,./<>?";
const int MAX_SIZE = 100000 ;

bool WordFrequence::IsWhiteChar( const char chr){
switch (chr){
case ' \t ' :
case ' \r ' :
case ' \n ' :
case ' ' :
case ' \0 ' :
return true ;
default :
return false ;
}
}

void WordFrequence::LoadFromFile(){
std::ifstream
is (file_name_, std::fstream:: in );
if ( ! is )
std::cerr
<< " error: can't open file: " << " [ " << file_name_ << " ] " << std::endl;
text
= new char [MAX_SIZE];
is .read(text, MAX_SIZE);
}

void WordFrequence::parse(){
word_frequence_map_.clear();
int index = 0 ;
int count = strlen(text);
std::
string str;
while (index < count){
for ( int i = index; i <= count; ++ i){
if (IsWhiteChar(text[i])){
int len = i - index + 1 ;
char * p = new char [len];
memcpy(p, text
+ index, i - index);
p[len
- 1 ] = ' \0 ' ;
str
= p;
++ word_frequence_map_[str];
index
= i + 1 ;
while (IsWhiteChar(text[index]))
++ index;
break ;
}
}
}
}

void WordFrequence::ReplaceSymbol(){
int j = 0 ;
while ( * (text + j) != ' \0 ' ){
for ( int i = 0 ; i < strlen(symbols); ++ i){
if ( * (text + j) == symbols[i])
* (text + j) = ' ' ;
}
j
++ ;
}
}

std::ostream
& operator << (std::ostream & os, const WordFrequence & wf){
os
<< " word\t\tfrequence " << std::endl;
os
<< " ----------------------- " << std::endl;
std::map
< std:: string , int > ::const_iterator i_begin = wf.word_frequence_map_.begin();
std::map
< std:: string , int > ::const_iterator i_end = wf.word_frequence_map_.end();
while (i_begin != i_end){
os
<< "" << i_begin -> first << " \t\t " << i_begin -> second << "" << std::endl;
++ i_begin;
}
return os;
}

?

?

?

?

      
#include < iostream >
#include
" word_frequence.h "
using namespace std;

int main( int argc, char * argv[])
{
WordFrequence wf(
" d:\\test.txt " );
return 0 ;
}

?

?

?

?

  實現的方式很簡單,首先把從文件里load出text,然后去掉里面的符號,最后掃描一遍文件,遇著單詞就塞到map

里面.

      ++word_freq_map["word"];


    

這句話太好用了。一句話實現插入map,如果有就增加value,如果沒有就插入。

?

  這個程序簡單訓練了一下map容器的使用方法,也用到文件的讀取。注意ostream open以后一定要判斷open

成功了沒有。ostream有幾種讀取方式,有格式化的>>讀取,也有getline這種一行讀取的,也有getchar這種一個字符

讀一次的。也有read這種一次讀一大段二進制的。讀的時候一定要對文件內容有先驗知識。

  如果一次讀的數據量很大,建議read來讀取,效率很高,用循環讀取可能效率很低。

統計英文文本中的詞頻


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論