⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dynamicphrasetable.cpp

📁 我们一个小组
💻 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 + -