質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

c++ 類似度計算について

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 251

asdfgpo

score 0

プログラミング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(N*1.0/tmp->num); 
cout << input_id1 << "->" << buf->data << ":" << tfidf << endl; 

buf = buf->next; 

f_data.close(); 
return 0; 
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • y_waiwai

    2020/07/15 21:01

    えーと、質問じゃなくて、コード修正依頼でしょうか

    キャンセル

  • asdfgpo

    2020/07/15 21:20

    そうです。失礼しました。よろしければ、お願いします。TF・IDF計算結果をリストにして、返す関数と類似度計算をして欲しいです。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る