Предложение поиска в строках

У меня есть текстовый файл, содержащий: mariam amr sara john jessy salma mkkkkkaooooorllll

пользователь вводит слово для поиска: например: maram

Как видите, в моем текстовом файле его нет.. Я хочу дать предложения, похожие на слово марам это мариам

Я использовал самую длинную общую подпоследовательность, но это дает mariam и mkkkkkaooooorllll, потому что оба содержат самую длинную общую подпоследовательность "mar"

Я хочу принудительно выбрать только Мариам. Есть идеи?

заранее спасибо

/**
 ** Java Program to implement Longest Common Subsequence Algorithm
 **/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

   /** Class  LongestCommonSubsequence **/
    public class  LongestCommonSubsequence
    {    
   /** function lcs **/
    public String lcs(String str1, String str2)
    {
    int l1 = str1.length();
    int l2 = str2.length();

    int[][] arr = new int[l1 + 1][l2 + 1];

    for (int i = l1 - 1; i >= 0; i--)
    {
        for (int j = l2 - 1; j >= 0; j--)
        {
            if (str1.charAt(i) == str2.charAt(j))
                arr[i][j] = arr[i + 1][j + 1] + 1;
            else 
                arr[i][j] = Math.max(arr[i + 1][j], arr[i][j + 1]);
        }
    }

    int i = 0, j = 0;
    StringBuffer sb = new StringBuffer();
    while (i < l1 && j < l2) 
    {
        if (str1.charAt(i) == str2.charAt(j)) 
        {
            sb.append(str1.charAt(i));
            i++;
            j++;
        }
        else if (arr[i + 1][j] >= arr[i][j + 1]) 
            i++;
        else
            j++;
    }


    return sb.toString(); 
   //read text file, if a word contains sb.toString() , print it


}

/** Main Function **/
public static void main(String[] args) throws IOException
{    
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Longest Common Subsequence Algorithm Test\n");

    System.out.println("\nEnter string 1");
    String str1 = br.readLine();

    System.out.println("\nEnter string 2");
    String str2 = br.readLine();

    LongestCommonSubsequence obj = new LongestCommonSubsequence(); 
    String result = obj.lcs(str1, str2);

    System.out.println("\nLongest Common Subsequence : "+ result);
}

}


person CodeX    schedule 01.07.2015    source источник
comment
Я думаю, это потому, что только mariam и mkkk.. начинаются с m. Бьюсь об заклад, ваш алгоритм проверяет char после char с самого начала. Пожалуйста, покажите нам код   -  person Toumash    schedule 01.07.2015
comment
@Toumach, потому что у обоих самая длинная общая подпоследовательность, и я добавлю код   -  person CodeX    schedule 01.07.2015
comment
Я не могу ответить, но я проголосую, чтобы люди увидели   -  person Toumash    schedule 01.07.2015


Ответы (1)


Существует несколько методов нечеткого сопоставления, подобных этому. Apache Commons предоставляет несколько отличных инструментов для сравнения того, насколько похожи две строки друг на друга. Ознакомьтесь с javadoc для Расстояние Левенштейна и Расстояние Яро Винклера.

С расстоянием Левенштейна чем ниже оценка, тем более похожи строки:

StringUtils.getLevenshteinDistance("frog", "fog") == 1
StringUtils.getLevenshteinDistance("fly", "ant") == 3

Вы также можете рассчитать двойной Метафон для каждой строки — это позволит вам определить, насколько похожи строки при произнесении, даже если они не обязательно пишутся одинаково.

Вернемся к вашему вопросу. Используя эти инструменты, вы можете предлагать предложения, если поисковый запрос пользователя находится в пределах определенного порога любой из строк в вашем текстовом файле.

person rcgeorge23    schedule 01.07.2015