Python: сколько похожих слов в строке? - PullRequest
2 голосов
/ 24 августа 2010

У меня есть несколько уродливых строк, подобных этим:

   string1 = 'Fantini, Rauch, C.Straus, Priuli, Bertali: 'Festival Mass at the Imperial Court of Vienna, 1648' (Yorkshire Bach Choir & Baroque Soloists + Baroque Brass of London/Seymour)'
   string2 = 'Vinci, Leonardo {c.1690-1730}: Arias from Semiramide Riconosciuta, Didone Abbandonata, La Caduta dei Decemviri, Lo Cecato Fauzo, La Festa de Bacco, Catone in Utica. (Maria Angeles Peters sop. w.M.Carraro conducting)'

Я бы хотел библиотеку или алгоритм, который даст мне процент от общего числа слов, но исключая специальные символы, такие как ',' и ':' и ''' и '{' и т. Д.

Мне известен алгоритм Левенштейна .Тем не менее, это сравнивает количество похожих CHARACTERS , тогда как я хотел бы сравнить, сколько WORDS у них общих

Ответы [ 3 ]

7 голосов
/ 24 августа 2010

Regex может легко дать вам все слова:

import re
s1 = "Fantini, Rauch, C.Straus, Priuli, Bertali: 'Festival Mass at the Imperial Court of Vienna, 1648' (Yorkshire Bach Choir & Baroque Soloists + Baroque Brass of London/Seymour)"
s2 = "Vinci, Leonardo {c.1690-1730}: Arias from Semiramide Riconosciuta, Didone Abbandonata, La Caduta dei Decemviri, Lo Cecato Fauzo, La Festa de Bacco, Catone in Utica. (Maria Angeles Peters sop. w.M.Carraro conducting)"
s1w = re.findall('\w+', s1.lower())
s2w = re.findall('\w+', s2.lower())

collections.Counter (Python 2.7+) может быстро подсчитать, сколько раз слово встречается.

from collections import Counter
s1cnt = Counter(s1w)
s2cnt = Counter(s2w)

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * 100 * * * * * * * * * * * * 1, но вы можете захотеть реализовать алгоритм Левенштейна, работающий со словами », и использовать эти два списка.

common = set(s1w).intersection(s2w) 
# returns set(['c'])

import difflib
common_ratio = difflib.SequenceMatcher(None, s1w, s2w).ratio()
print '%.1f%% of words common.' % (100*common_ratio)

Отпечатки: 3.4% of words similar.

2 голосов
/ 24 августа 2010

Алгоритм Ленвенштейна сам по себе не ограничивается сравнением символов, он может сравнивать любые произвольные объекты.Тот факт, что в классической форме используются символы, является деталью реализации, это могут быть любые символы или конструкции, которые можно сравнивать на равенство.

В Python преобразуйте строки в списки слов, а затем примените алгоритм к спискам.,Может быть, кто-то другой может помочь вам убрать нежелательных персонажей, предположительно используя магию регулярных выражений.

2 голосов
/ 24 августа 2010
n = 0
words1 = set(sentence1.split())
for word in sentence2.split():
    # strip some chars here, e.g. as in [1]
    if word in words1:
        n += 1

( 1 : Как удалить символы из строки с помощью Python? )

Редактировать: обратите внимание, что это слово считается общим дляоба предложения, если они есть где-то в обоих - для сравнения позиции вы можете опустить преобразование набора (просто вызовите split () для обоих), используйте что-то вроде:

n = 0
for word_from_1, word_from_2 in zip(sentence1.split(), sentence2.split()):
    # strip some chars here, e.g. as in [1]
    if word_from_1 == word_from_2:
        n += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...