题目描述
-
实现一种简单原始的文件相似度计算,即以两文件的公共词汇占总词汇的比
例来定义文章内容相似度。为简化问题,这里不考虑中文(因为分词困难),只
考虑长度不小于 1000 个英文单词的文章,长度超过 10 字母的单词只考虑前 10
个字母。 -
输入:给出要检查的英文文本文件的文件夹位置
-
输出:
- 以表格形式给出该文件夹下两两文件的相似度数值
- 可以查询两文件的公共词汇(按照英文顺序输出)
- 考虑词频【加分点】
-
说明:
两文件的相似度定义为两文件的公共词汇量占两文件总词汇量的百分比。
如
文件 1:Aaa Bbb Ccc
文件 2:Bbb Ccc Ddd
则相似度为 50%,公共词汇为 Bbb Ccc -
自己构造测试用输入输出数据,验收时提交。
如文件夹下有 a.txt、b.txt、c.txt 三个文件,输出如下
a.txt,b.txt 55%
a.txt,c.txt 60%
a.txt,c.txt 30%
思路
- 大致理解一下题目:首先要对文件夹中的文本文件进行统计,然后将文本中的内容提取出来,在对其进行词频的统计,然后带入公式计算相似度。
- 对文本文件的统计:这里考虑使用File类中的filelist()方法,将目标文件夹中的文本目录,放在一个数组中,然后利用二层循环对文本的两两对比进行控制。
- 对文本内容的提取:这里考虑使用IO流,即FileReader类;(注意:FileReader是以ASCII码的形式将内容读进来,所以要将其转化成char型的字符 tip:由于转化成String类型有可能造成多个单词存储进同一个变量的情况,即String str = “I am a boy”,所以这里用char)
- 分词:由于读进来的内容是以字母为单位,而英文文本中,空格和符号又是分词的标准,所以我们一次为基准,将字母合并为一个个单词,存储进ArrayList列表中的对应位置中。
- 统计词频:这里考虑建立一个类,其中包含变量word,和mem(下面的代码我们使用的是table1代替mem),分别用来存储单词和单词出现的次数,类似于C语言中的结构体,然后将结构体放在一个ArrayList类型的列表中。
- 计算:直接带入我们得到的公式:重复数/(单词总数-重复数)。
代码:
package Test1;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
class Clear{
int count = 0;
int tk = 0;
int tk1 = 0;
ArrayList<FinalTable> arrayft=new ArrayList<>();//词频的链表
ArrayList<String> tabletest = new ArrayList<>();//以字母为单位进行存储的链表
ArrayList<String> tabletest1 = new ArrayList<>();
ArrayList<String> a_table = new ArrayList<>();//以单词为单位进行存储的链表
ArrayList<String> b_table = new ArrayList<>();
public void clearup(String address1, String address2 ) throws IOException{
FileReader fr = new FileReader(address1);
FileReader fr1 = new FileReader(address2);
String str = new String();
int t = 0;
int len = 0;
int t1 = 0;
int count = 0;
for( int i=0; (len = fr.read())!=-1; i++ ) {
if( (len <= 90 && len >= 65) || (len<=122 && len>=97) || len==32) {
tabletest.add(str.valueOf((char)len)