java - 查找包含另一个字符串的字符串部分,以及可能的中间单词

标签 java text-search

对于本学期的最后一个项目,目标是在 Song 对象内的歌词字符串上运行特定短语的搜索,然后根据子字符串匹配的长度对结果进行排名。歌词是从文件中读取的,并与该文件中的换行符匹配。

例如,搜索“她爱你”将在示例匹配中返回以下内容:

披头士乐队:“...她爱你,是啊,是啊,是啊……”排名= 13 个字符
Bonnie Raitt:“...只是爱你...”排名= 18 个字符
埃尔维斯·普雷斯利:“...你在问她是否爱我\r\n好吧,不知道...”排名= 23 个字符

正如您从上一个示例中看到的,匹配可以跨越多行。

我有 TreeMap<String, TreeSet<Song>> 中的所有歌曲,所以我得到了与查询中第一个单词匹配的所有歌曲。我遇到的困难是在字符串中搜索匹配项,因为正则表达式在这种情况下不起作用。

构造 Song 对象时,我将歌词转储到 Set 中以运行单个单词的搜索,为此我使用了 String.split("[^a-zA-Z}")分离出单个单词并清除标点符号。所以我想在该数组上运行搜索。我正在使用的过程如下:

break up the query into a String array
  for each Song in the set
    if (song.lyrics.contains(query)
      great, break loop to next song

    otherwise
      int queryCounter=0;
      find first index point in String array that matches query[queryCounter]
        using that as the start point, iterate through the String array for matches

迭代完成后,将创建一个 Rank 对象来保存匹配的数组部分的歌曲、搜索短语、起点和终点。 Rank 对象中有一个方法来计算字符数并补偿空白以计算排名。然后将其插入 PriorityQueue,其中将从原始 matchSet 中提取前十个匹配项。

问题是这并不能防止误报,而且匹配排名可能会出现偏差。例如,Aerosmith的Beyond Beautiful包含“...她爱我,她不爱你...”通过我的流程,我将匹配“...她爱我,她爱 不是...”,因此我的排名将是 27,而不是 13。

我需要进行哪些更改才能消除误报和不正确的排名?

最佳答案

我想补充一下 jjinguy 所说的内容:

Basically, in the 'otherwise' block, after you find the first index that matches the start, you also have to look for possible other start points, and reset your start if you find another one

我会保留一首歌中所有可能匹配的列表,最后使用排名最高的那个。简单地重置起点可能无法捕获排名最高的比赛。

也许这不是最好的方法,但担忧仍然存在。

关于java - 查找包含另一个字符串的字符串部分,以及可能的中间单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4155729/

相关文章:

java线程和jtabbedpane

java - Junit测试后临时文件没有被删除

node.js - 如何在 MongoDB 上为部分文本搜索创建索引?

android - Filterable 自定义 ArrayAdapter 在速度方面的效率如何?

Javascript 在字符串中查找单词的索引(不是单词的一部分)

java - 线程安全 - 以列表为值的并发 HashMap

java - Java中的树实现(根, parent 和 child )

java - java中 block 2个线程访问一个if block

.net - 在 DataTemplate 中使用 TextSearch.Text