プログラミングc++言語での質問です。
類似度計算のプログラムなのですが、教えていただける方、よろしくお願いします。実装するのはsimilarity.cppの中の「記述」と書いてある部分です。 similarity.cpp のmk_tfidf_list関数は、引数として指定した記事IDに含まれる名詞のTF・IDF値をリストにして返す関数です。→ TF・IDF計算のプログラムを改良し、計算結果をリストにして返すようにして下さい。記事に出現した単語がその単語のTF・IDF値、出現していない単語は0として生成して下さい。修正依頼です。尾根がします。
<内容>
similarity.cpp のmk_tfidf_list関数は、引数として指定した記事IDに含まれる名詞のTF・IDF値をリストにして返す関数です。→ 「TF・IDF計算」の課題(*)のプログラムを改良し、計算結果をリストにして返すようにして下さい。
単語ベクトルの生成で、記事に出現していない単語は0として生成となっていますが、実際の類似度計算においては、内積(分子)もノルム(分母)の計算においても「0」を考慮する必要はありません。
similarity.cpp
include <iostream>
include <fstream>
include <stdlib.h>
include <string.h>
include <math.h>
define N 227
using namespace std;
struct cell
{
string key;
int value;
double tfidf;
struct cell *next;
};
using namespace std;
// 機能:引数として指定した記事IDに含まれる名詞のTF・IDF値をリストにして返す
// 備考:TF・IDF計算プログラムを関数にしたもの
struct cell *mk_tfidf_list(string input_id)
{
// TF・IDF計算プログラムを記述
return NULL;
}
int main(int argc, char *argv[])
{
string id1 = argv[1];
string id2 = argv[2];
// 指定した記事ID1のTF・IDFリスト
struct cell *tf_idf1;
tf_idf1 = mk_tfidf_list(id1);
// 指定した記事ID1のTF・IDFリスト
struct cell *tf_idf2;
tf_idf2 = mk_tfidf_list(id2);
double sim = 0;
// 類似度計算のコードを記述
cout << id1 << " - " << id2 << " : " << sim << endl;
}
(*)参考にするTF・IDF計算のプログラム
include <iostream>
include <fstream>
include <stdlib.h>
include <string.h>
include <math.h>
include <fstream>
define N 227
using namespace std;
struct cell{ //tf
int num;
string data;
cell *next;
};
struct cell *make_cell(int num, string data){
struct cell *mk_cell;
mk_cell = new struct cell;
mk_cell->data = data;
mk_cell->num = num;
mk_cell->next = NULL;
return mk_cell;
}
struct cell *search_cell(string data,cell *head){
struct cell *buf;
buf= head;
while(buf != NULL){
if(buf->data == data){
return buf;
}
buf = buf->next;
}
return NULL;
}
void print_cell(cell *head){
cell *buf;
buf = head;
while(buf != NULL){
cout << buf->data << ":" << buf->num << endl;
buf = buf->next;
}
}
int main(int argc, char *argv[]){
int size = 0;
string input_id1 = argv[1]; // 指定したファイルIDを取得
ifstream f_data("posdata.txt"); // posdata.txt ファイルオープン
string line;
cell *head;
head = NULL;
// postdata.txtから1行ずつ読み込み
while(f_data >> line){
// 記事IDと名詞例(noun1, noun2,...)のデータに分割
int index = line.find(",");
string f_id = line.substr(0,index);
string w_str = line.substr(index+1);
if(f_id == input_id1){
// split 名詞列のデータから名詞を1つずつ取り出し
int n;
for(int i=0; i <= w_str.length(); i=n+1 ){
n = w_str.find_first_of(",", i);
if( n == string::npos ) {
n = w_str.length();
}
string word = w_str.substr(i, n-i ); //単語
if(search_cell(word,head) == NULL){ //単語がなかった場合
struct cell *tmp;
tmp = make_cell(1,word);
tmp->next = head;
head = tmp;
size++;
}else if (search_cell(word,head) != NULL){
cell *tmp2;
tmp2 = search_cell(word,head);
tmp2->num++;
}
}
}
}
ifstream fin("df.txt");
string line2;
cell *head2;
head2 = NULL;
while(fin >> line2){
int index = line2.find(",");
string f_id2 = line2.substr(0,index);
string w_str2 = line2.substr(index+1);
int num2 = atoi(w_str2.data());
cell *tmp2 = make_cell(num2,f_id2);
tmp2->next = head2;
head2 = tmp2;
}
cell *buf = head;
while(buf!=NULL){
double tfidf = 0;
double df = 0;
cell *buf2 = head2;
cell tmp = search_cell(buf->data,head2);
if(tmp != NULL){
tfidf = buf->num * log2(N1.0/tmp->num);
cout << input_id1 << "->" << buf->data << ":" << tfidf << endl;
}
buf = buf->next;
}
f_data.close();
return 0;
}
あなたの回答
tips
プレビュー