KWIC的实现(C++)

KWIC的实现(C++)

KWIC(Key Word in Context)

写完了之后才发现这个题目不是仅仅是写出来而已,而是要按照相应的软件体系结构去写,但是也没心思去再改了,反正就这个样子。
我这个有点接近管道过滤器的风格(使用 set 偷懒)。
我没测出来bug,在指定的输出格式下,当然,对其他的输出格式这段代码应该是毫无抵抗力的。

#include<iostream>
#include<string>
#include<set>
#include<vector>
#include<stdlib.h>
#include<stdio.h>
#include<fstream>

using namespace std;
//kwic

void InPut(const char* filename,vector<string>& vv)
{
    FILE* fp = fopen(filename, "r+");
    if (fp == nullptr)
    {
        printf("文件打开失败!\n");
        exit(1);
    }
    char buff[256] = { 0 };
    while (!feof(fp))
    {
        fgets(buff, 255, fp);

        string tmp(buff);
        tmp.pop_back();
        vv.push_back(move(tmp));
    }

    fclose(fp);
}
void Circular_Shifter(vector<string>& vv, set<string>& ss)//变换//排序
{
    for (int i = 0;i < vv.size();i++)
    {
        string tmp = vv[i];
        while (ss.find(tmp) == ss.end())
        {
            ss.insert(tmp);
            for (int i = 0;i < tmp.size() && tmp[i] != ' ';i++)
            {
                if (i == 0)tmp.push_back(' ');

                tmp.push_back(tmp[i]);
            }
            auto begin = tmp.begin();
            auto last = begin;
            for (;*last != ' ';)
            {
                last++;
            }
            if (*last == ' ')last++;
            tmp.erase(begin, last);

        }
    }
}
//void Alphabetizer(set<string>& ss)//排序
//{}

void OutPut(const char *filename,set<string>& ss)//输出
{
    /*for (auto& x : ss)
    {
        std::cout << x << std::endl;
    }*/
    //FILE* fp=fopen(filename, "w");
    std::ofstream swrite(string(filename), ostream::app);
    for (auto& len : ss)
    {
        swrite << len << endl;
    }

    swrite.close();
}
int main()
{
    vector<string> vv;
    InPut("a.txt",vv);

    set<string> ss;
    Circular_Shifter(vv,ss);
    //Alphabetizer(ss);
    OutPut("b.txt",ss);
    
    return 0;
}

测试
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KWIC(Key Word In Context)是一种文本处理技术,用于生成索引或摘要。基于隐式调用风格的KWIC实现是一种基于函数调用的方式实现KWIC的方法。以下是一个简单的Python代码实现: ```python def kwic(text, keyword): """ 基于隐式调用风格的KWIC实现 """ def shift(lst): return [lst[i:] + lst[:i] for i in range(len(lst))] lines = text.split('\n') phrases = [line.strip().split() for line in lines if line.strip()] shifted_phrases = [shift(phrase) for phrase in phrases] indexed_phrases = [(i, phrase) for i, phrase in enumerate(shifted_phrases)] keyword_indices = [i for i, phrase in indexed_phrases for word in phrase if word == keyword] results = [] for i in keyword_indices: phrase = shifted_phrases[i] line = lines[indexed_phrases[i][0]] results.append((line, ' '.join(phrase))) return results ``` 在这个实现中,我们定义了一个`kwic`函数,该函数接受两个参数:`text`表示要处理的文本,`keyword`表示要查找的关键字。函数内部定义了一个`shift`函数,该函数接受一个列表并返回其所有可能的循环移位版本。 接下来,我们将输入文本分割成行,并将每行转换为一个单词列表。然后,对于每个单词列表,我们生成所有可能的循环移位版本,并将其与原始列表一起索引。接下来,我们查找所有包含关键字的单词列表,并将它们的索引与原始文本行一起返回。 这种实现方法的一个优点是它可以很容易地进行扩展,例如,我们可以将`shift`函数替换为一个更复杂的移位算法,或者将关键字匹配改为不区分大小写或使用正则表达式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值