как узнать, что два предложения означают одно и то же, я использовал соотношение нечеткой логики - PullRequest
0 голосов
/ 24 июня 2019

У меня есть файл, содержащий массу сообщений. Теперь я хочу сгруппировать сообщения подобного типа. Если приходит какое-то новое сообщение, оно должно добавить их в группу, если оно не похоже на существующее, а затем создать новое

Я уже пробовал предоставленный код, я пытался сравнить 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>
...