поиск ключевых слов в ячейке данных - PullRequest
1 голос
/ 07 ноября 2019

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

пример

  words             |   category
-----------------------------------
im a test email     |  email
here is my handout  |  handout

вот что у меня есть

conditions = [
        (df['words'].str.contains('flyer',False,regex=True)),
        (df['words'].str.contains('report',False,regex=True)),
        (df['words'].str.contains('form',False,regex=True)), 
        (df['words'].str.contains('scotia',False,regex=True)),  
        (df['words'].str.contains('news',False,regex=True)), 
         (df_prt_copy['words'].str.contains('questions.*\.pdf',False,regex=True)),
         .
         .
         .
         .
    ]
    choices = ['open house flyer', 
               'report', 
               'form', 
               'report',
               'news', 
               ‘question',
                  .
                  .
                  .
                  .
              ]
     df['category']=np.select(conditions, choices, default='others')

это прекрасно работает, но проблема в том, что у меня много ключевых слов (вероятно, более 120 или около того)Таким образом, ведение этого списка ключевых слов очень сложно, есть ли лучший способ сделать это? Кстати, я использую python3

примечание: я ищу более простой способ управления большим списком ключевых слов, который отличается от простого метода поиска ключевых слов здесь

Ответы [ 3 ]

0 голосов
/ 07 ноября 2019

Вы можете объединить все свои ключевые слова и использовать str.findall в случае, если у вас есть несколько ключевых слов в одной строке, а затем map для выбора вариантов выбора:

df = pd.DataFrame({"words":["im a test email",
                            "here is my handout",
                            "This is a flyer"]})

choices = {"flyer":"open house flyer",
           "email":"email from someone",
           "handout":"some handout"}

df["category"] = df["words"].str.findall("|".join(choices.keys())).str.join(",").map(choices)

print (df)

#
                words            category
0     im a test email  email from someone
1  here is my handout        some handout
2     This is a flyer    open house flyer
0 голосов
/ 07 ноября 2019

вы можете использовать flashtext ..

 import pandas as pd
 from flashtext import KeywordProcessor

 keyword_dict = {
 'programming': ['python', 'pandas','java','java_football'],
 'sport': ['cricket','football','baseball']
 } 

 kp = KeywordProcessor()
 kp.add_keywords_from_dict(keyword_dict)
 df = pd.DataFrame(['i love working in python','pandas is very popular library','i love playing football'],columns= ['text'])

 df['category'] = df['text'].apply(lambda x: kp.extract_keywords(x, span_info = True))

enter image description here

теперь возникает проблема с таким словом, как 'todayIgotAemailReport', к которому вы можете обратиться Как разбить текст без пробелов на список слов? думаю, это может помочь вам разбить любой тип неизвестного объединяющего слова

import wordninja
' '.join(wordninja.split('todayIgotAemailReport'))

#this will break this into their respective word which can make your stuff easy, while searching
#op
'today I got A email Report' 
0 голосов
/ 07 ноября 2019

Вы могли бы создать список conditions динамически. Если у вас есть список ключевых слов, скажем, key_words, вы можете for просмотреть список ключевых слов и append условия, такие как (df['words'].str.contains(key_words[iter], False, regex=True)), к списку conditions.

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