Сравнение строк для назначения метки - PullRequest
0 голосов
/ 02 апреля 2020

Я хотел бы классифицировать элементы в строках (я использую pandas фрейм данных) на основе списка строк:

list_topics=['orange', 'sports', 'technology', 'apple pie','fruits']

Я хочу посмотреть, содержит ли веб-сайт одну из этих строк по порядку классифицировать их.

Например:

 Website
www.apple.com
www.orange_is_the_new_black.co.uk
...
www.mitapple.com

Эти элементы хранятся в строке (строка [0]). Я попытался следующим образом:

    writer = csv.writer(f_output, lineterminator='\n')
    reader = csv.reader(f_input)

    header = next(reader)
    header.append('Classification')
    writer.writerow(header)

    for row in reader:
        check_el = ['not classified']
        for x in list_topics:
            if row[0].str.contains[x]:
                check_el[0] = x
        writer.writerow(row + match)

Однако он возвращает только не классифицированные, а (ожидаемый результат):

  Website                                Topics
www.apple.com                            apple
www.orange_is_the_new_black.co.uk        orange
...                                      ...
www.mitapple.com                         apple

Не могли бы вы сказать мне, как сравнить каждую строку со строками в списке и посмотреть, если строка содержит одну из этой строки?

Спасибо

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете сначала сгладить свой список тем, разделив внутренние строки в понимании списка, а затем использовать str.extract, чтобы найти совпадения с элементами в списке:

l = [j for i in list_topics for j in i.split()]
df['Topics'] = df.Website.str.extract(rf"({'|'.join(l)})")

print(df)

                             Website  Topics
0                      www.apple.com   apple
1  www.orange_is_the_new_black.co.uk  orange
2                   www.mitapple.com   apple

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

df_topics = pd.DataFrame(list_topics, columns=['topics'])

fuzzy_merge(df, df_topics, left_on='Website', right_on='topics', how='left', cutoff=0.25)

                             Website  Topics     topics
0                      www.apple.com   apple  apple pie
1  www.orange_is_the_new_black.co.uk  orange     orange
2                   www.mitapple.com   apple        NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...