Analyse De Similarité En Pourcentage (Java)
j'ai la situation suivante:
chaîne a = " un crawler Web est un programme informatique qui parcourt l'internet du World Wide Web automatiquement"; String b = "Web Crawler" programme d'ordinateur navigue sur le World Wide Web";
y a-t-il une idée ou un algorithme standard pour calculer le pourcentage de similarité?
par exemple, dans le cas ci-dessus, la similarité estimée par la recherche manuelle devrait être 90%++.
My l'idée est de marquer les deux Chaînes et de comparer le nombre de jetons de correspondance. Quelque chose comme (7 tokens /10 tokens) * 100. Mais, bien sûr, elle n'est pas efficace du tout pour cette méthode. Comparer le nombre de caractères appariés ne semble pas non plus être efficace....
est-ce que quelqu'un peut donner des directives???
ci-dessus fait partie de mon projet, Analyseur de plagiat.
par conséquent, les mots appariés seront exactement les mêmes sans aucun synonymes.
la seule chose qui importe dans cette affaire, c'est de savoir comment calculer un pourcentage assez précis de similitude.
Merci beaucoup pour toute aide.
6 réponses
comme Konrad l'a souligné, votre question dépend fortement de ce que vous entendez par"similaire". En général, je dirais que les lignes directrices suivantes devraient être utilisées:
- normaliser l'entrée en réduisant un mot à sa forme de base et en minuscule
- utilisez une liste de fréquences de mots (facilement accessible sur le web) et faites en sorte que la "pertinence de la similarité" du mot soit inversement proportionnelle à sa position sur la liste de fréquences
- calculer la similarité totale de la phrase comme une similarité agrégée des mots apparaissant dans les deux Phrases divisé par la pertinence de la similarité totale des phrases
vous pouvez affiner la technique pour inclure les différences entre les formes de mots, l'ordre des mots de phrase, les listes de synonymes, etc. Bien que vous n'obtiendrez jamais des résultats parfaits, vous avez beaucoup de possibilités de modification et je crois qu'en général, vous pourriez obtenir des mesures très utiles de similitude.
cela dépend de votre idée de similitude. Officiellement, vous devez définir une métrique de ce que vous considérez comme "similaires" les chaînes d'appliquer les statistiques. Habituellement, cela se fait via la question hypothétique: "dans quelle mesure est-il probable que la première chaîne soit une version modifiée de la première chaîne où des erreurs (par exemple en la tapant) ont été introduites?"
une mesure très simple mais efficace pour une telle similitude (ou plutôt, l'inverse) est la distance d'édition de deux cordes qui peuvent être calculées en utilisant la programmation dynamique, qui prend le temps O ( nm ) en général, où n et m sont les longueurs des cordes.
selon votre usage, des mesures plus élaborées (ou complètement indépendantes, comme la" métrique 1519150920 "soundex ) pourraient être nécessaires.
Dans votre cas, si vous directement appliquer une correspondance de jeton (c.-à-d. simple nombre de mots) vous jamais obtenir une similarité > 90%. Pour obtenir une si grande similitude d'une manière significative exigerait une analyse sémantique avancée. Si vous obtenez ceci fait, s'il vous plaît publier le document parce que c'est encore un problème largement non résolu.
je suis d'accord avec ce que Konrad Rudolf a déjà dit.
D'autres peuvent recommander des mesures de distance différentes. Ce que je vais dire accompagne ceux-ci, mais se penche davantage sur le problème de la sémantique.
étant donné ce que vous semblez chercher, je vous recommande d'appliquer certaines des méthodes standard de traitement de texte. Tous ces facteurs ont des inconvénients potentiels, donc je les énumère par ordre d'application et de difficulté à bien faire
- Phrase de fractionnement. Trouvez vos unités de comparaison.
- stop-mot de suppression: un, une, le, la, de, etc.
- sac de mots pourcentage: quel pourcentage de l'ensemble des mots correspondent, indépendamment de la commande
- (beaucoup plus agressif) vous pourriez essayer expansion synonymique, qui compte des synonymes comme mots assortis.
le problème avec cette question Est que la similarité peut être soit une similarité humanisée (comme vous dites" + -90% de similarité") ou une similarité statistique (réponse de Kondrad Rudolph).
la similitude humaine ne peut jamais être facilement calculée: par exemple, ces trois mots
cellphone car message
mobile automobile post
la similarité statistique est très faible, alors qu'en fait elle est assez similaire. Ainsi: il sera difficile de résoudre ce problème, et le seul que je peux vous indiquer à est un filtrage bayésien ou Intelligence artificielle avec réseaux bayésiens .
une mesure courante est la distance de Levenshtein, un cas particulier de la distance d'édition de chaîne. Il est également inclus dans la chaîne apache util bibliothèque
la" sous-séquence commune la plus longue est une métrique de dis-similarité de chaîne de caractères bien connue, qui est implémentée dans la programmation dynamique