2014-05-14 4 views
2

Я ищу простой способ реализовать поиск близости в java.Внедрение текста приближения в Java

При поиске Proximity я имею в виду, как она определяется Lucene:

Lucene поддерживает поиск слов, находящихся в пределах определенного расстояния. Чтобы выполнить поиск по близости, используйте тильду, символ «~» в конце фразы . Например, для поиска «Apache» и «Jakarta» в течение 10 слов друг от друга в документе воспользоваться поиском:

«Jakarta Апач» ~ 10

Более конкретно: в качестве начала я хотел бы реализовать метод следующим образом:

public static boolean proximityMatches(String txt, String term1, String term2, int wordDistance) { 


// for the inputs: 
// txt= "this is a really foo barred world", term1="foo", term2="world", wordDistance=4 
// return true 

// for the inputs: 
// txt= "this is a really foo barred world", term1="this", term2="bar", wordDistance=1 
// return false 

} 

Примечания:

  1. Я знаю, как написать функцию Satis с учетом требований, которые я поставил там - то, что я ищу, является общепринятым стандартным способом реализации этого.

Спасибо.

+2

Этот вопрос слишком широк. Что именно вы пытаетесь достичь? Я имею в виду, вы не пишете полномасштабную поисковую систему, не так ли? Входы, выходы, контекст, детали: помогите нам помочь! –

+0

Простите, что - попытается сдержать вопрос еще. – user1172468

+0

@AlanMoore, отредактировал мой вопрос. Благодарю. – user1172468

ответ

2

Если есть приемлемый стандартный способ сделать это, использовать Lucene. Там являются некоторые регулярные выражения уловок, которые можно использовать, как этот из библиотеки RegexBuddy (где word1 и word2 являются заполнители для поисковых терминов и 3 в {1,3}? максимальное расстояние):

\b(?:word1(?:\W+\w+){1,3}?\W+word2|word2(?:\W+\w+){1,3}?\W+word1)\b 

Беда в том, это зависит от чрезвычайно упрощенного, произвольного представления о том, что представляет собой слово. Он не соответствует сокращениям или переносным словам, но он соответствует «словам» с цифрами и подчеркиваниями в них. Вы можете настроить регулярное выражение, чтобы справиться с этими проблемами, но для их замены появится больше. И уродливый, как это уже было, каждая настройка делает регулярное выражение намного менее удобочитаемым, что намного сложнее поддерживать.

Это едва царапает поверхность того, из каких полнотекстовых поисковых систем вас спасает. Если у вас есть очень конкретная, жестко ограниченная задача для выполнения, могут потребоваться регулярные выражения или другие инструменты «синтаксиса». Но если вам нужно работать на семантическом уровне, распознавая слова и фразы на естественном языке, вам нужна поисковая система или другой выделенный инструмент.

+0

спасибо за ответ. Можно ли использовать ссылку Lucene API без предварительного создания индекса? – user1172468

1

Если вы ищете слово слева, вы можете попробовать это.

String str = "Lucene supports finding words are a within a specific distance away."; 
boolean found = false; 
int start = str.length() -1; 
int end = str.length(); 

    while (!found) 
    { 
     if (str.substring(start, end).contains("specific")) 
     { 
      int total = end - start; 
      System.out.println("You word has been found " + total + " characters to the left"); 
      found = true; 
     } 
     else 
     { 
      start -= 1; 
     } 
    } 
+0

Эй, спасибо - я обновил свои вопросы - спасибо – user1172468

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