2016-12-01 8 views
1

У меня есть два файла, и я пытаюсь напечатать уникальные предложения между обоими файлами. Для этого я использую difflib в python.найти уникальные предложения в двух файлах

text ='Physics is one of the oldest academic disciplines. Perhaps the oldest through its inclusion of astronomy. Over the last two millennia. Physics was a part of natural philosophy along with chemistry.' 
text1 ='Physics is one of the oldest academic disciplines. Physics was a part of natural philosophy along with chemistry. Quantum chemistry is a branch of chemistry.' 
import difflib 

differ = difflib.Differ() 
diff = differ.compare(text,text1) 
print '\n'.join(diff) 

и не дает мне желаемого результата. Это дает мне это.

P 
    h 
    y 
    s 
    i 
    c 
    s 

    i 
    s 

    o 
    n 
    e 

    o 
    f 

    t 
    h 
    e 

Мой желаемый результат - это уникальные предложения между обоими файлами.

текст = Возможно, самый старый из его включения в астрономию. За последние два тысячелетия.

text1 = Квантовая химия - это отрасль химии.

Также кажется, что difflib.Differ идет по строкам не по предложениям. Любое предложение пожалуйста. Как я могу это сделать?

ответ

2

Во-первых, действительно, Differ(). Compare() сравнивает строки, а не предложения.

Во-вторых, он фактически сравнивает последовательности, такие как списки строк. Однако вы передаете две строки, а не два списка строк. Поскольку строка также является последовательностью (символов), Differ(). Compare() в вашем случае сравнивает отдельные символы.

Если вы хотите сравнить файлы по предложениям, вы должны подготовить два списка предложений. Вы можете использовать nltk.sent_tokenize (текст), чтобы разбить строку на предложения.

diff = differ.compare(nltk.sent_tokenize(text),nltk.sent_tokenize(text1)) 
print('\n'.join(diff)) 
# Physics is one of the oldest academic disciplines. 
#- Perhaps the oldest through its inclusion of astronomy. 
#- Over the last two millennia. 
# Physics was a part of natural philosophy along with chemistry. 
#+ Quantum chemistry is a branch of chemistry. 
+0

Спасибо DYZ. Спасибо, что указали на мою ошибку. У меня есть еще один вопрос к вам. Скажем, у нас есть одна строка «Я мальчик», а другая - «Я, мальчик». Существует (,) после am. differ.compare говорит, что они оба уникальны не одинаково из-за (,). Как мы можем рассматривать этот случай здесь. Я связан с nltk. Но могу ли я справиться с этим делом здесь. – Raj

+0

Я не знаком с пакетом difflib (но я рад узнать об этом!), Но вы также можете лишить любую пунктуацию вручную, прежде чем запускать текст через diff. Проверьте полосу() для своих строк перед расщеплением на период. – SummerEla

+0

Я предлагаю вам использовать слово tokenizer из nltk для извлечения слов: '." .join (w для w в nltk.word_tokenize ('я, мальчик'), если w.isalpha()) '. Или вы можете использовать регулярные выражения для извлечения слов. – DyZ

1

Как указано выше, Дзиновьев передает строки в функцию, которая ожидает списки. Вам не нужно использовать NLTK, вместо этого вы можете просто превратить свои строки в списки предложений, разделив их на период.

import difflib 

text1 ="""Physics is one of the oldest academic disciplines. Perhaps the oldest through its inclusion of astronomy. Over the last two millennia. Physics was a part of natural philosophy along with chemistry.""" 
text2 ="""Physics is one of the oldest academic disciplines. Physics was a part of natural philosophy along with chemistry. Quantum chemistry is a branch of chemistry.""" 

list1 = list(text1.split(".")) 
list2 = list(text2.split(".")) 

differ = difflib.Differ() 
diff = differ.compare(list1,list2) 
print "\n".join(diff) 
+0

Спасибо SummerEla – Raj

+0

Могут быть другие знаки препинания, разделяющие предложения, такие как!,?, ... и т. Д. – DyZ

Смежные вопросы