- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用以下代码从单词中提取了二元语法:
Scanner a = new Scanner(file1);
PrintWriter pw1= new PrintWriter(file2);
while (a.hasNext()) {
String gram=a.next();
pw1.println(gram);
int line;
line = gram.length();
for(int x=0;x<=line-2;x++){
pw1.println(gram.substring(x, x+2));
}
}
pw1.close();
}
catch(FileNotFoundException e) {
System.err.format("FileNotExist");`
}
例如,“student”的二元词是“st”、“tu”、“ud”、“de”、“en”、“nt”。
但是我需要找到相似度计算。
我必须计算这些 split 克之间的相似度值。
最佳答案
嗯,你没有很好地解释你的问题,但这是我的尝试。
首先,你的代码到处都是,即使是这么小的程序,任何人都很难阅读任何内容,我会编辑它以使其可读,但我不确定我是否被允许。
无论如何,二元组 = 字母、单词或音节对(根据 Google 的说法)。您正在寻找它的相似度值吗?
我对此做了一些研究,看来您需要的算法就是这个。
现在,让我们开始充实这一点。 OP,如果我误解了你的问题,请纠正我。您正在通过将单词分解为二元组并找到它们各自的相似度值来寻找单词之间的相似性,是吗?如果是这样,让我们在开始使用这个公式之前对其进行分解,因为它肯定是您需要的。
现在,我们有两个词:法国和法语。如果将它们分解为二元组,我们希望找到它们的相似度值。
对于法国,我们有 {FR, RA, AN, NC, CE}
对于法语,我们有 {FR、RE、EN、NC、CH}
France 和 French 旨在表示第一个方程中的 s1 和 s2。接下来,我们获取他们在两个二元组中的匹配。我的意思是,在这两个单词中都可以找到哪些二元组或字母对?在这种情况下,答案是 FR 和 NC。
由于我们找到了 2 对,因此顶部的值变为 4,因为公式规定,2 乘以匹配的二元组的数量。所以我们在顶部有 4 个,没有其他的。
现在,下半部分是通过将您正在比较的每个单词可以组成的二元组数量相加来解决的,即 5 个代表 FRANCE,5 个代表 FRENCH。所以分母是 10
那么现在我们有什么?我们有 4/10,即 0.4。 那是我们的相似度值,这就是您在制作程序时需要找到的值。
让我们尝试另一个例子,以便将其根植于我们的头脑中,让我们说
s1 =“歌利亚”
s2 =“守门员”
因此,使用二元组,我们得出了字符串数组...
{"GO","OL","LI","IA","AT","TH"}{"GO","OA","AL","LI","IE"}
现在,匹配的数量。这两个单词中有多少个匹配的二元组?答案 - 2、GO 和 LI
所以,分子将有
2 x {2 场比赛} = 4
现在,分母是,歌利亚有 6 个二元组,守门员有 5 个二元组。请记住,我们必须根据原始公式将这 2 个值相加,因此我们的分母将为 11。
那么,我们将何去何从?
S(歌利亚,守门员) = 4/11 ~ .364 <----- 相似度值
我在此链接下找到了公式(以及基本上我刚刚学到的所有内容),这确实使事情变得容易理解。
http://www.catalysoft.com/articles/StrikeAMatch.html
我将编辑此评论,因为我需要一段时间才能为您的类(class)提出一个方法,但只是为了快速回复,如果您正在寻找有关如何操作的更多帮助,链接是很好的起点。
编辑****
好的,刚刚为其构建了方法,就在这里。
public class BiGram
{
/*
here are your imports
import java.util.Scanner;
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
*/
//you'll have to forgive the lack of order or common sense, I threw it
//together fast I could cuz it sounded like you were in a rush
public String[][] bigramizedWords = new String[2][100];
public String[] words = new String[2];
public File file1 = new File("file1.txt");
public File file2 = new File("file2.txt");
public int tracker = 0;
public double matches = 0;
public double denominator = 0; //This will hold the sum of the bigrams of the 2 words
public double results;
public Scanner a;
public PrintWriter pw1;
public BiGram()
{
initialize();
bigramize();
results = matches/denominator;
pw1.println("\n\nThe Bigram Similarity value between " + words[0] + " and " + words[1] + " is " + results + ".");
pw1.close();
}
public static void main(String[] args)
{
BiGram b = new BiGram();
}
public void initialize()
{
try
{
a = new Scanner(file1);
pw1 = new PrintWriter(file2);
while (a.hasNext())
{
//System.out.println("Enter 2 words delimited by a space to calculate their similarity values based off of bigrams.");
//^^^ I was going to use the above line, but I see you are using File and PrintWriter,
//I assume you will have the files yourself with the words to be compared
String gram = a.next();
//pw1.println(gram); -----you had this originally, we don't need this
int line = gram.length();
for(int x=0;x<=line-2;x++)
{
bigramizedWords[tracker][x] = gram.substring(x, x+2);
pw1.println(gram.substring(x, x+2) + "");
}
pw1.println("");
words[tracker] = gram;
tracker++;
}
}
catch(FileNotFoundException e)
{
System.err.format("FileNotExist");
}
}
public void bigramize()
{
denominator = (words[0].length() - 1) + (words[1].length() - 1);
//^^ Let me explain this, basically, for every word you have, let's say BABY and BALL,
//the denominator is gonna be the sum of number of bigrams. In this case, BABY has {BA,AB,BY} or 3
//bigrams, same for BALL, {BA,AL,LL} or 3. And the length of the word BABY is 4 letters, same
//with Ball. So basically, just subtract their respective lengths by 1 and add them together, and
//you get the number of bigrams combined from both words, or 6
for(int k = 0; k < bigramizedWords[0].length; k++)
{
if(bigramizedWords[0][k] != null)
{
for(int i = 0; i < bigramizedWords[1].length; i++)
{
///////////////////////////////////////////
if(bigramizedWords[1][i] != null)
{
if(bigramizedWords[0][k].equals(bigramizedWords[1][i]))
{
matches++;
}
}
}
}
}
matches*=2;
}
}
关于java - 基于 n 元字符的相似性度量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26037351/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!