Удалить близкие совпадения / похожие фразы из списка - PullRequest
0 голосов
/ 05 марта 2020

Я работаю над удалением похожих фраз из списка, но я столкнулся с небольшим препятствием.

У меня есть предложения и фразы, фразы связаны с предложением. Все фразы предложения находятся в одном списке.

Пусть список фраз будет: p=[['This is great','is great','place for drinks','for drinks'],['Tonight is a good','good night','is a good','for movies']]

Я хочу, чтобы мой вывод был [['This is great','place for drinks'],['Tonight is a good','for movies']]

По сути, я хочу получить все самые длинные уникальные фразы в списке.

Я взглянул на библиотеку fuzzywuzzy, но не могу найти хорошее решение.

вот мой код:

def remove_dup(arr, threshold=80):
    ret_arr =[]
    for item in arr:
        if item[1]<threshold:
            ret_arr.append(item[0])
    return ret_arr

def find_important(sents=sents, phrase=phrase):

    import os, random
    from fuzzywuzzy import process, fuzz

    all_processed = [] #final array to be returned
    for i in range(len(sents)):

        new_arr = [] #reshaped phrases for a single sentence
        for item in phrase[i]:
            new_arr.append(item)

        new_arr.sort(reverse=True, key=lambda x : len(x)) #sort with highest length

        important = [] #array to store terms
        important = process.extractBests(new_arr[0], new_arr) #to get levenshtein distance matches
        to_proc = remove_dup(important) #remove_dup removes all relatively matching terms.
        to_proc.append(important[0][0]) #the term with highest match is obviously the important term.


        all_processed.append(to_proc) #add non duplicates to all_processed[]

    return all_processed

Может кто-нибудь указать, что мне не хватает, или как лучше это сделать? Заранее спасибо!

1 Ответ

1 голос
/ 05 марта 2020

Я бы использовал разницу между каждой фразой и всеми другими фразами. Если фраза содержит хотя бы одно другое слово по сравнению со всеми остальными фразами, то она уникальна и должна быть сохранена.

Я также сделал ее устойчивой к точным совпадениям и добавил пробелы

sentences = [['This is great','is great','place for drinks','for drinks'],
['Tonight is a good','good night','is a good','for movies'],
['Axe far his favorite brand for deodorant body spray',' Axe far his favorite brand for deodorant spray','Axe is']]

new_sentences = []
s = " "
for phrases in sentences :
    new_phrases = []
    phrases = [phrase.split() for phrase in phrases]
    for i in range(len(phrases)) :
        phrase = phrases[i]
        if all([len(set(phrase).difference(phrases[j])) > 0 or i == j for j in range(len(phrases))]) :
            new_phrases.append(phrase)
    new_phrases = [s.join(phrase) for phrase in new_phrases]
    new_sentences.append(new_phrases)
print(new_sentences)

Вывод:

[['Это здорово', 'место для напитков'],

['Сегодня хороший вечер', 'спокойной ночи', 'для фильмов'],

[«Топор далеко не его любимый бренд дезодоранта для тела», «Топор»]]

...