2014-09-25 2 views
1

я извлекаемые би-граммы из слов, используя код:п-граммовые символы на основе сходство меры

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");` 
} 

Например, би-граммы «студента» являются «ули», «тот», «ud», «de», «en», «nt».

Но мне нужно найти расчет подобия.

Мне нужно рассчитать значение подобия между этими разделенными граммами.

+3

Что вы подразумеваете под значением сходства? – VinayVeluri

+0

что вы хотите спросить точно? Сначала сделайте себе ясно, затем сделайте свой код понятным, чтобы мы могли помочь вам, если сможем. – yogesh

+1

Как, например, Жаккар из двух наборов биграмм? Вам не хватает 'try {' в вашем фрагменте ... – vefthym

ответ

6

Ummm, вы не очень хорошо объясняете свой вопрос, но вот мой выстрел в него.

Прежде всего, ваш код повсюду, даже эта небольшая программа, трудно кому-либо читать что-либо, я бы отредактировал его, чтобы сделать его доступным для чтения, но я не уверен, что мне разрешено.

Anyways, bigrams = пары букв, слов или слогов (согласно Google). И вы ищете значение сходства?

Ну, я немного поработал над этим, и кажется, что вам нужен алгоритм.

Formula for finding the similarity value of the bigrams of 2 words


Теперь, давайте начнем конкретизации это. ОП, исправьте меня, если я неправильно понял ваш вопрос. Вы ищете сходство между словами, разбивая их на бирамы и находите их соответствующие значения сходства, да? Если да, давайте разложим эту формулу, прежде чем мы начнем ее использовать, потому что она, безусловно, будет той, которая вам нужна.

A specific example of the formula in action for the 2 words, FRANCE and FRENCH

Теперь у нас есть 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; 




     } 

} 
+1

сходство в кости - это лишь одна из многих функций сходства. – vefthym

+0

Правда, но OP не дает нам много работать, я понял, что что-то лучше, чем ничего, тем более, что OP, похоже, спешит. Я собираюсь опубликовать код, который я придумал, чтобы решить эту проблему. Я выложу его после того, как закончу некоторые ошибки. Может быть, вы могли бы проверить, правильно ли я сделал это? Понимаете, я узнал все это менее чем 2 часа назад, я понятия не имею, что я делаю, я просто следую инструкциям. Похоже, вы знаете это лучше меня. – DreadHeadedDeveloper

+0

Абсолютно верно! Конечно, я не критикую вас! Я просто даю дополнительную информацию для более полного ответа. – vefthym

Смежные вопросы