📄 dynamicphrasetable.cpp
字号:
#include "DynamicPhraseTable.h"
#include <algorithm>
#include <fstream>
using namespace std ;
DynamicPhraseTable::DynamicPhraseTable()
{
}
bool DynamicPhraseTable::InsertPhrase(const string& strPYPhrase,int nid,double frequency)
{
vector<ID> & newId = m_Phrase2VectorMap[strPYPhrase];
ID temp(nid,frequency);
vector<ID>::iterator it = find(newId.begin(),newId.end(), temp);
if(it == newId.end())
{
newId.push_back(temp);
}
else
{
it->frequency += DYNAMIC_FREQUENCY_INCREASEMENT ;
}
return true ;
}
bool DynamicPhraseTable::GetVectorByPhrase(const string& strPYPhrase,vector<ID> &vecPhrase)
{
vecPhrase.clear() ;
hash_map<string, vector<ID> >::iterator it = m_Phrase2VectorMap.find(strPYPhrase);
if( it == m_Phrase2VectorMap.end())
return false;
else
{
vector<ID> & v = it->second;
sort(v.begin(), v.end()) ;
for(size_t i = 0 ; i < v.size(); i++ )
vecPhrase.push_back(v[i]);
}
return true;
}
int DynamicPhraseTable::GetPhraseByLongestMatchPy(const string& strPy, vector<ID> &vecPhraseID)
{
vecPhraseID.clear() ;
size_t longestMatchPos = 0 ;
for (size_t i = 0; i<strPy.size(); i++)
{
string strTemp = strPy.substr(0, i+1) ;
hash_map<string, vector<ID> >::iterator it = m_Phrase2VectorMap.find(strTemp);
if (it != m_Phrase2VectorMap.end())
{
longestMatchPos = i ;
}
}
string strLongestPy = strPy.substr(0, longestMatchPos+1) ;
GetVectorByPhrase(strLongestPy, vecPhraseID) ;
if (vecPhraseID.size() == 0)
{
return static_cast<int>(longestMatchPos);
}
else
{
return static_cast<int>(longestMatchPos) + 1 ;
}
}
bool DynamicPhraseTable::IncreaseFrequency(const string& strPy, int id)
{
vector<ID>& vec = m_Phrase2VectorMap[strPy] ;
for (size_t i=0; i<vec.size(); i++)
{
if (vec[i].getid() == id)
{
vec[i].frequency += DYNAMIC_FREQUENCY_INCREASEMENT;
std::sort(vec.begin(), vec.end()) ;
return true;
}
}
return false ;
}
bool DynamicPhraseTable::Save(const string& strFileName)
{
ofstream out(strFileName.c_str()) ;
if ( !out.is_open() )
{
return false ;
}
size_t iSize = m_Phrase2VectorMap.size() ;
out << iSize << endl;
for (hash_map<string, vector<ID> >::iterator it = m_Phrase2VectorMap.begin(); it!=m_Phrase2VectorMap.end(); it++)
{
out << it->first << endl;
vector<ID>& vec = it->second ;
size_t iVecSize = vec.size() ;
out << iVecSize << endl;
for (size_t j=0; j<iVecSize; j++)
{
out << vec[j].getid() << " " << vec[j].getfrequency() << endl;
}
}
out.close() ;
return true ;
}
bool DynamicPhraseTable::Load(const string& strFilename)
{
ifstream in(strFilename.c_str()) ;
if ( !in.is_open() )
{
return false ;
}
size_t iSize ;
in >> iSize ;
for (size_t i=0; i<iSize; i++)
{
string str ;
in >> str ;
size_t iVecSize ;
in >> iVecSize ;
for (size_t j=0; j<iVecSize; j++)
{
int id ;
double frequency ;
in >> id >> frequency ;
InsertPhrase(str, id, frequency) ;
}
}
in.close() ;
return true ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -