【问题标题】:String Search search a Phrase in a line in any order字符串搜索 以任意顺序在一行中搜索一个短语
【发布时间】:2018-07-12 23:10:04
【问题描述】:

我正在尝试使用任何顺序的单词匹配来实现短语搜索。 但是,添加的任何额外单词都应显示为不匹配。

例如

"i want pizza"

在任何情况下都应该匹配以下内容。

"want i pizza"
"i want pizza"
"pizza want i"

但它不应该匹配除搜索字符串之外的任何单词。

它不应该匹配:

"i want a pizza on monday"

谁能指导我用任何 JAVA、C# 或 Python 实现这个实现。

目前我正在使用 MYSQL 全文搜索。但是需要实现这个方案来避免全文搜索的错误。如果有任何方法可以直接使用 MYSQL 的全文搜索来做到这一点,请建议

【问题讨论】:

  • 您是在数据库上还是在代码中尝试这样做?在代码中,您可以尝试将文本和搜索短语拆分为单词,创建基数映射或从两者中设置(如果基数无关紧要)并比较它们。
  • 应该也匹配 Yoda 的pizza i want 吗?
  • 我正在尝试在 MYSQL 以及用于不同目的的代码中进行此操作

标签: java python string search full-text-search


【解决方案1】:

在java中类似:

public static void main(String[] args){
   String str = "i want pizza";
   List<String> list = Arrays.asList("want i pizza", "i want pizza", "pizza want i","i want a pizza on monday");
   list.stream()
           .filter(s->Arrays.asList(str.split(" ")).containsAll(Arrays.asList(s.split(" "))))
           .forEach(System.out::println);
}

【讨论】:

    【解决方案2】:

    在 python 代码中执行此操作的一种方法是使用拆分和比较。

    A =  "i want pizza"
    V = ["want i pizza", "i want pizza", "pizza want i", "i want a pizza on monday"]
    
    A = sorted(A.split())
    
    match = [i for i in V if A == sorted(i.split())]
    print match
    

    输出:

    ['want i pizza', 'i want pizza', 'pizza want i']
    

    【讨论】:

      【解决方案3】:

      当键是您希望找到的单词并且值是表示是否在句子中找到的布尔值时,您可以使用哈希图。 如果没有找到其中一个词或句子中的一个词不存在,则返回 false; 否则它是真的:

      公共类主{

      public static void main(String[] args) {
          // TODO Auto-generated method stub
          System.out.println(scanTheWords("want i pizza") );
          System.out.println(scanTheWords("i want pizza") );
          System.out.println(scanTheWords("i want a pizza on monday") );
      
      
      }
      public static boolean scanTheWords (String sentence)
      {
          HashMap<String, Boolean> words = new HashMap<>();
          words.put("i", false);
          words.put("want", false);
          words.put("pizza", false);
          String [] senteceWord = sentence.split(" ");
      
          for(String s: senteceWord)
          {
              if(!words.containsKey(s))
                  return false;
              else 
                  words.put(s, true);
          }
          for ( boolean b : words.values())
          {
              if(b==false)
                  return false;
          }
          return true;
      }
      

      }

      输出

      真 真的 假的

      【讨论】:

        【解决方案4】:

        将python与set一起使用:

        query = "i want a pizza".split()
        
        l = ["want i pizza", "i want pizza", "pizza want i", "i want a pizza on monday"]`
        
        l = [x.split() for x in l]
        
        print([x for x in l if set(x) - set(query)==set() ])
        

        输出:

        [['want', 'i', 'pizza'], ['i', 'want', 'pizza'], ['pizza', 'want', 'i']]
        

        【讨论】:

          猜你喜欢
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 2014-05-25
          • 1970-01-01
          • 1970-01-01
          • 2021-11-28
          • 2016-05-15
          相关资源
          最近更新 更多