Частотная матрица - как построить в Python - PullRequest
1 голос
/ 17 октября 2019

У меня очень мало опыта работы с Python и я пытаюсь построить частотную матрицу, которая бы суммировала, сколько заголовков публикаций содержат конкретные ключевые слова, с разбивкой по факультетам и группам ключевых слов (SDG). Мой текущий скрипт использует тестовые данные и показывает случаи, когда в заголовке факультета есть ключевое слово из одной из групп ключевых слов. Я не уверен, как организовать это в матрицу (подсчитать количество случаев по факультетам и SDG) и вывести его в CSV.

Мой ожидаемый вывод будет иметь следующие 3 заголовка столбца:

Факультет, Количество заголовков с ключевыми словами, SDG (группа ключевых слов)

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

Любая помощь приветствуется. Спасибо

import pandas
import re   

data1 = {'SDG1':['Africa', 'Basic services', 'Class', 'Vulnerable','Wealth distribution'], 'SDG2':['Agricultural Orientation index',  'Agriculture', 'Consume', 'abcd', 'defg']} 
keywords = pandas.DataFrame(data1) 
keywords = keywords.applymap(lambda s:s.lower() if type(s) == str else s)

data2 = {'Title':['Africa blabla Class', 'Basic services blabla Class', 'Wealth abcdabcd', 'Wealth distribution 1', 'Wealth distribution 2','Consume blabla'], 'Faculty':['Eng', 'FHM', 'Eng', 'Architecture', 'Eng', 'Architecture']} 
titles =  pandas.DataFrame(data2) 
titles = titles.applymap(lambda s:s.lower() if type(s) == str else s)
dict_Fac = pandas.Series(titles.Faculty.values,index=titles.Title).to_dict()

res = False
NumberofTitleswithKeywords=0
for key,value in dict_Fac.items():
    title =  key
    for column in keywords:
        patterns = keywords[column]
        res = False
        for pattern in patterns:                          
            #print('Looking for "%s" in "%s" ->' % (pattern, title), end=' ')

            if re.search(pattern, title):
                res = True                   
        if res:
            print (value)
            print("FoundKeywordfrom"+str(column))

1 Ответ

0 голосов
/ 17 октября 2019

Полагаю, вы просто хотите проверить, содержат ли заголовки ключевые слова из SDG1 или SDG2. Это можно сделать с помощью Series.str.findall:

import pandas
import re

data1 = {'SDG1':['Africa', 'Basic services', 'Class', 'Vulnerable','Wealth distribution'], 'SDG2':['Agricultural Orientation index',  'Agriculture', 'Consume', 'abcd', 'defg']}

data2 = {'Title':['Africa blabla Class', 'Basic services blabla Class', 'Wealth abcdabcd', 'Wealth distribution 1', 'Wealth distribution 2','Consume blabla'], 'Faculty':['Eng', 'FHM', 'Eng', 'Architecture', 'Eng', 'Architecture']}
titles =  pandas.DataFrame(data2)
titles = titles.applymap(lambda s:s.lower() if type(s) == str else s)

sdg1 = r"|\b".join(i+r"\b" for i in data1["SDG1"])
sdg2 = r"|\b".join(i+r"\b" for i in data1["SDG2"])

titles["SDG1"] = titles["Title"].str.findall(sdg1,flags=re.IGNORECASE)
titles["SDG2"] = titles["Title"].str.findall(sdg2,flags=re.IGNORECASE)

print (titles)

#
                         Title       Faculty                     SDG1       SDG2
0          africa blabla class           eng          [africa, class]         []
1  basic services blabla class           fhm  [basic services, class]         []
2              wealth abcdabcd           eng                       []         []
3        wealth distribution 1  architecture    [wealth distribution]         []
4        wealth distribution 2           eng    [wealth distribution]         []
5               consume blabla  architecture                       []  [consume]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...