проверить, содержит ли два предложения общие слова-пальгиаристы в питоне - PullRequest
0 голосов
/ 26 января 2019

Привет, я писал программу обнаружения плагиата.

Объяснение

В основном я пишу функцию , которая принимает ввод как 2 строки . Функция должна найти, если в обеих строках есть 5 или более последовательных слов. Строка будет состоять только из строчных букв и пробелов: без знаков препинания, из заглавных букв.

Требование

Если есть такие слова, вернуть самую длинную такую ​​строку слов (в терминах количества слов, а не длины строки).Если нет, следует вернуть логическое значение False.Я написал некоторый код, и я не знаю, где он идет не так.

Мой прогресс

def check_plagiarism(str1,str2):

    list1=str1.split()
    list2=str2.split()

    new1=[]
    new2=[]
    for i in list1:
        if (i in list2):
            new1.append(i)
    for j in list2:
        if (j in list1):
            new2.append(j)
    ans=[]


    for i in range(0,len(new1)-1):

        for j in range(0,len(new2)-1):

            while new1[i]==new2[j]:
                val=new1[i]
                ans.append(val)
                i+=1
                j+=1
                if i==len(new1) or j==len(new2):
                    return False
            if len(ans)>=5:
                value=" ".join(ans)
                return value
            else:
                ans=[]
    value=" ".join(ans)
    return value   

Мне удалось написать эту функцию.Я знаю, что он довольно длинный и неэффективный, но работает abit.

Ввод

Я предоставил следующий вход для функции.

a="i took a walk around the world to ease my troubled mind i left my body lying somewhere in the sands of time i watched the world float to the dark side of the moon i feel there is nothing i can do yeah i watched the world float to the dark side of the moon after all i knew it had to be something to do with you i really dont mind what happens now and then as long as youll be my friend at the end if i go crazy then will you still call me superman if im alive and well will you be there holding my hand ill keep you by my side with my superhuman might kryptonite"
b="i dont care if i go crazy then one two three four five switch crazy go i if care dont i five four three two one and switch"
c="when i was young i took a walk around the woods i found that i was both taller and smaller than the trees returning to my home i set out for the desert i journeyed for long days and nights my spirit left my body and i left my body lying somewhere in the sands of time unburdened by physical form i watched the world float away from me and into the vast moonlight"

print(check_plagiarism(a,b))
print(check_plagiarism(a,c))
print(check_plagiarism(b,c))

Полученный результат

if i go crazy then
took a walk around the
False

Ожидаемый результат

if i go crazy then
i left my body lying somewhere in the sands of time
False

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Мне удалось удалить все ошибки, а также решить мой код благодаря помощи @Kenny Ostrom.

Окончательный код:

def check_plagiarism(str1,str2):

new1=str1.split()
new2=str2.split()
# set up data structures
best_answer = []

# logic to find candidates
for i in range(0,len(new1)):
    for j in range(0,len(new2)):
        ans = []
        if new1[i]==new2[j]:
            n=i
            m=j
            while new1[n]==new2[m]:

                ans.append(new1[n])
                if n<len(new1)-1 and m<len(new2)-1:
                    n+=1
                    m+=1        
                else:
                    break

        if len(ans)>=len(best_answer):

            best_answer = list(ans)    

if len(best_answer) >= 5:
    return " ".join(best_answer)
return False

Спасибо за помощь

0 голосов
/ 26 января 2019

У вас есть другие проблемы, которые я не собираюсь обсуждать, но чтобы ответить на конкретный вопрос, почему вы получаете короткий ответ, когда существует лучший и более длинный ответ, это потому, что вы использовали «возврат».

Вот способ найти самый длинный соответствующий ответ, используя грубую силу, если код действительно работал. Я получил это, чтобы напечатать ожидаемое значение с некоторыми изменениями во внутреннем цикле и исправить одну серьезную ошибку, но вы просто должны поверить мне в этом.

def check_plagiarism_revised(str1,str2):
    # set up data structures
    best_answer = []

    # logic to find candidates
    for i in range(0,len(new1)-1):
        for j in range(0,len(new2)-1):
            ans = []

            # do stuff

            if len(ans)>=len(best_answer):
                best_answer = list(ans)    

    if len(best_answer) > 5:
        return " ".join(best_answer)
    return ""

Думай об этом, как о том, чтобы выбрать шоколадку. Вы действительно хотите темный шоколад, а у меня есть. Я согласен дать вам одну конфету, и я покажу вам все мои конфеты по одной. Затем вы можете выбрать тот, который вы хотите.

Однако, если вы остановите меня, как только я подниму сникерс-бар, вытащите его из моей руки, съешьте и убегите. Ну, темный шоколад у тебя не получается? Вот что делает оператор return.

Я опубликовал ответ на ваш конкретный вопрос, но вы должны рассмотреть вопрос об отмене всего этого и начать все сначала (хотя это может быть немного сложнее): https://en.wikipedia.org/wiki/Longest_common_substring_problem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...