У меня есть файл, содержащий массу сообщений. Теперь я хочу сгруппировать сообщения подобного типа. Если приходит какое-то новое сообщение, оно должно добавить их в группу, если оно не похоже на существующее, а затем создать новое
Я уже пробовал предоставленный код, я пытался сравнить 2 сообщения, скажем, msg1 и msg2 на основе их соотношения FuzzySearch, которое работает для одинаковой длины сообщения, но не работает в сценарии, где длина не одинакова
msg1 -> "кто-то пытался войти в ваш аккаунт, свяжитесь с нами, это не вы"
msg -> "кто-то пытался войти в вашу учетную запись, если этот человек не вы,
пожалуйста, свяжитесь с нами по электронной почте или в чате, мы здесь, чтобы помочь вам "
в этих msg1.length , так что отношение уменьшено, но среднее значение такое же, как я могу решить эту проблему
Я не хочу уменьшать процентное соотношение поискового запроса, так как это увеличит вероятность несходства данных в группе.
В настоящее время я использую их, я не против, если мне предложат какой-нибудь другой способ, который работает лучше, чем этот
образец файла сообщения
import me.xdrop.fuzzywuzzy.FuzzySearch;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class GroupBySimilarData
{
public static void main( String[] args )
{
String fName = "config/demo.txt";
// Method #1 - Read all lines as a Stream
fileStreamUsingFiles( fName );
System.out.println();
}
// Method #1
private static void fileStreamUsingFiles( String fileName )
{
try
{
Map<Integer, HashSet<String>> simmilerMsgMap = new HashMap<>();
HashSet<String> msgHashSet;
HashSet<String> mgsTrackingHashset = new HashSet<>();
Stream<String> lines = Files.lines( Paths.get( fileName ) );
List<String> linesList = lines.collect( Collectors.toList() );
for( int i = 0; i < linesList.size(); i++ )
{
msgHashSet = new HashSet<>();
msgHashSet.add( linesList.get( i ) );
for( int j = i + 1; j < linesList.size(); j++ )
{
int matchingRatio = FuzzySearch.ratio( linesList.get( i ), linesList.get( j ) );
if( matchingRatio >= 92 )
{
if( !mgsTrackingHashset.contains( linesList.get( j ) ) )
{
msgHashSet.add( linesList.get( j ) );
simmilerMsgMap.put( i, msgHashSet );
}
mgsTrackingHashset.add( linesList.get( j ) );
}
}
}
System.out.println( simmilerMsgMap );
/*linesList.forEach(System.out :: println);*/
lines.close();
}
catch( IOException io )
{
io.printStackTrace();
}
}
}
получение : "вывод:
{0 = [кто-то пытался войти в вашу учетную запись, но не вы, Джон попытался войти в вашу учетную запись, не вы]}
ожидается : "выход:
{0 = [кто-то пытался войти в вашу учетную запись, связался с нами, но это не вы, Джон попытался войти в вашу учетную запись, связался с нами, но это не вы; не вы, пожалуйста, свяжитесь с нами по электронной почте или в чате, мы здесь, чтобы помочь вам} "
используемая зависимость pom:
<!-- https://mvnrepository.com/artifact/me.xdrop/fuzzywuzzy -->
<dependency>
<groupId>me.xdrop</groupId>
<artifactId>fuzzywuzzy</artifactId>
<version>1.1.10</version>
</dependency>