我正在一个项目中,我需要在文本段落中搜索特定的字符串。但是,我不需要完全匹配,更多的是%匹配。
例如,这是我正在搜索的文本段落:
Fluticasone Propionate Nasal Spray, USP 50 mcg per spray is a
corticosteroid indicated for the management of the nasal symptoms of
perennial nonallergic rhinitis in adult and pediatric patients aged 4 years
and older."
然后我要搜索以下几行中的任何单词是否与该段落匹配:
1)Unspecified acute lower respiratory infection
2)Vasomotor rhinitis
3)Allergic rhinitis due to pollen
4)Other seasonal allergic rhinitis
5)Allergic rhinitis due to food
6)Allergic rhinitis due to animal (cat) (dog) hair and dander
7)Other allergic rhinitis
8)"Allergic rhinitis, unspecified"
9)Chronic rhinitis
10)Chronic nasopharyngitis
我最初的方法是使用布尔值,并且包含:
boolean found = med[x].toLowerCase().contains(condition[y].toLowerCase());
但是,每个循环的结果都是负数。
我期望的结果将是:
1) False
2) True
3) True
4) True
5) True
6) True
7) True
8) True
9) True
10) False
对于Java及其方法来说是非常新的。基本上,如果A中的任何单词与B中的任何单词匹配,则将其标记为true。我怎么做?
谢谢!
答案 0 :(得分:1)
您必须首先标记其中一个字符串。您现在正在做的是尝试匹配整行。
类似的事情应该起作用:
String text = med[x].toLowerCase();
boolean found =
Arrays.stream(condition[y].split(" "))
.map(String::toLowerCase)
.map(s -> s.replaceAll("\\W", "")
.filter(s -> !s.isEmpty())
.anyMatch(text::contains);
我添加了删除标点符号和所有空白字符串的功能,以便我们在这些字符上没有错误的匹配项。 (\\W
实际上删除了[A-Za-z_0-9]
中不存在的字符,但是您可以将其更改为所需的任何字符。)
如果您需要这样做以提高效率,因为您有很多文本,则可能需要将其改正并使用Set
来进行快速查找。
private Stream<String> tokenize(String s) {
return Arrays.stream(s.split(" "))
.map(String::toLowerCase)
.map(s -> s.replaceAll("\\W", "")
.filter(s -> !s.isEmpty());
}
Set<String> words = tokenize(med[x]).collect(Collectors.toSet());
boolean found = tokenize(condition[y]).anyMatch(words::contains);
您可能还想过滤出 stop 单词,例如to
,and
等。
您可以使用列表here并在检查空白字符串的过滤器之后添加一个额外的过滤器,以检查该字符串不是停用词。
答案 1 :(得分:0)
如果您使用可搜索的单词来构建列表,这会容易得多。假设您的段落存储为字符串:
ArrayList<String> dictionary = new ArrayList<>();
dictionary.add("acute lower respiratory infection");
dictionary.add("rhinitis");
for(int i =0; i<dictionary.size(); i++){
if(paragraph.contains(dictionary.get(i))){
System.out.println(i + "True");
}
else{
System.out.println(i +"False");
}
}
答案 2 :(得分:0)
这将为您提供“粗略”匹配百分比。
这是它的工作方式:
将要搜索的文本和搜索词拆分为一组单词。这可以通过使用正则表达式拆分来完成。每个单词都转换为大写并添加到集合中。
计算搜索词在文本中出现的数量。
计算搜索词在文字中所占的百分比。
您可能希望通过去除诸如'a','the'等常用词来增强此功能。
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
public class CrudeTextMatchThingy {
public static void main(String[] args) {
String searchText = "Fluticasone Propionate Nasal Spray, USP 50 mcg per spray is a \n" +
"corticosteroid indicated for the management of the nasal symptoms of \n" +
"perennial nonallergic rhinitis in adult and pediatric patients aged 4 years \n" +
"and older.";
String[] searchTerms = {
"Unspecified acute lower respiratory infection",
"Vasomotor rhinitis",
"Allergic rhinitis due to pollen",
"Other seasonal allergic rhinitis",
"Allergic rhinitis due to food",
"Allergic rhinitis due to animal (cat) (dog) hair and dander",
"Other allergic rhinitis",
"Allergic rhinitis, unspecified",
"Chronic rhinitis",
"Chronic nasopharyngitis"
};
Arrays.stream(searchTerms).forEach(searchTerm -> {
double matchPercent = findMatch(searchText, searchTerm);
System.out.println(matchPercent + "% - " + searchTerm);
});
}
private static double findMatch(String searchText, String searchTerm) {
Set<String> wordsInSearchText = getWords(searchText);
Set<String> wordsInSearchTerm = getWords(searchTerm);
double wordsInSearchTermThatAreFound = wordsInSearchTerm.stream()
.filter(s -> wordsInSearchText.contains(s))
.count();
return (wordsInSearchTermThatAreFound / wordsInSearchTerm.size()) * 100.0;
}
private static Set<String> getWords(String term) {
return Arrays.stream(term.split("\\b"))
.map(String::trim)
.map(String::toUpperCase)
.filter(s -> s.matches("[A-Z0-9]+"))
.collect(Collectors.toSet());
}
}
输出:
0.0% - Unspecified acute lower respiratory infection
50.0% - Vasomotor rhinitis
20.0% - Allergic rhinitis due to pollen
25.0% - Other seasonal allergic rhinitis
20.0% - Allergic rhinitis due to food
20.0% - Allergic rhinitis due to animal (cat) (dog) hair and dander
33.33333333333333% - Other allergic rhinitis
33.33333333333333% - Allergic rhinitis, unspecified
50.0% - Chronic rhinitis
0.0% - Chronic nasopharyngitis
如果您不希望有一个百分比,但是非,则可以......
boolean matches = findMatch(searchText, searchTerm) > 0.0;
希望这会有所帮助。