Ummm, вы не очень хорошо объясняете свой вопрос, но вот мой выстрел в него.
Прежде всего, ваш код повсюду, даже эта небольшая программа, трудно кому-либо читать что-либо, я бы отредактировал его, чтобы сделать его доступным для чтения, но я не уверен, что мне разрешено.
Anyways, bigrams = пары букв, слов или слогов (согласно Google). И вы ищете значение сходства?
Ну, я немного поработал над этим, и кажется, что вам нужен алгоритм.
Теперь, давайте начнем конкретизации это. ОП, исправьте меня, если я неправильно понял ваш вопрос. Вы ищете сходство между словами, разбивая их на бирамы и находите их соответствующие значения сходства, да? Если да, давайте разложим эту формулу, прежде чем мы начнем ее использовать, потому что она, безусловно, будет той, которая вам нужна.
Теперь у нас есть 2 слова, Франция, ФРАНЦУЗСКИЙ. Мы хотим найти значения сходства, если они были разбиты на битрамы.
Для Франции, мы имеем {FR, RA, А.Н., NC, CE}
Для ФРАНЦУЗСКИЙ, мы имеем {FR, RE, EN, NC, CH}
Франция и французский предназначены для представления s1 и s2 из первого уравнения. Затем мы проводим матчи, которые у них есть в обоих биграммах. Что я имею в виду, это то, какие биграммы или пары букв можно найти в обоих словах? В этом случае ответом будет FR и NC.
Так как мы обнаружили 2 пары, значение сверху преобразуется в 4, так как состояние формулы, умноженное на число совпадающих биграмм. Итак, у нас есть 4 на вершине, и больше ничего.
Теперь нижняя половина решена путем добавления числа биграмм, которые могут быть сделаны из каждого из слов, которые вы сравниваете, а именно 5 для ФРАНЦИИ и 5 для FRENCH. Значит, знаменатель будет 10
Итак, что у нас есть? У нас 4/10, или .4. THAT - это наше значение сходства, и это значение, которое нужно найти при создании вашей программы.
Давайте попробуем другой пример просто искоренить это в наши головы, скажем
s1 = «GOLIATH»
s2 = «ВРАТАРЯ»
Таким образом, используя биграмм, мы придумали массив строк ...
{«GO», «OL», «LI», «IA», «AT», «TH»} {«GO», «OA», «AL», «LI», «IE»}
Теперь nu матер матчей. Сколько совпадающих биграмм в этих двух словах? Ответ - 2, ГО и LI
так, числитель бы
2 х {2 Удачные} = 4
Теперь знаменатель, мы имеем 6 биграмм для Голиафа и 5 биграмм для вратаря. Помните, что мы должны добавить эти 2 значения в исходную формулу, поэтому наш знаменатель будет равен 11.
Итак, где это нас покидает ??
S (Голиафа, ВРАТАРЯ) = 4/11 ~ .364 < ----- значение Сходство
Я нашел формулы (и в основном все, что я только сейчас узнал) по этой ссылке которые действительно упростили понимание.
http://www.catalysoft.com/articles/StrikeAMatch.html
Я буду редактировать этот комментарий, так как он будет считать меня некоторое время, чтобы придумать способ для своего класса, но только для быстрого ответа, если вы ищете больше помощи о том, как сделать это, ссылка - хорошее место для начала.
EDIT ****
Ok, только что построенный метод для этого, здесь.
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;
}
}
Что вы подразумеваете под значением сходства? – VinayVeluri
что вы хотите спросить точно? Сначала сделайте себе ясно, затем сделайте свой код понятным, чтобы мы могли помочь вам, если сможем. – yogesh
Как, например, Жаккар из двух наборов биграмм? Вам не хватает 'try {' в вашем фрагменте ... – vefthym