Python: оценка каждого слова, хранящегося в переменной, после цикла

У меня есть дело, которое мне нужно решить, но я застрял без решения почти неделю. вот в чем дело. У меня есть три переменные:

candidates = ["you", "the", "best", "love", "fun", "feeling", "emotionally"]
seeds = ["happy", "love", "enjoy", "fun", "grace", "sad", "guilty"]
tweets = ["you look so happy", "I am in love with you", "hey you do the best at having fun okay", "i am emotionally sad right now", "feeling guilty"]

и что я хочу сделать, так это соединить слово из переменной «кандидаты» со словами из «семян», зациклить их вместе над твитами и дать оценку за циклом каждому слову из переменной «кандидаты».

так например: для первой петли я пара:

you + happy
you + love
you + enjoy
you + fun
you + grace
you + sad
you + guilty

и перебирают их по строкам в переменных «твитах» и дают оценку, основанную на том, сколько раз эта пара встречается в предложениях из переменных твитов. так что в этом случае оценка, которую я получу за слово «you» в паре со всеми словами из переменной «seed», равна 3.

и продолжаем второй цикл с парами:

the + happy
the + love
the + fun
the + enjoy
the + grace
the + sad
the + guilty

и снова зациклите их на строках в переменных "tweets" и дайте оценку, основанную на том, сколько раз эта пара встречается в предложениях из переменных tweets. так что в этом случае оценка, которую я получу за слово «you» в паре со всеми словами из переменной «seed», равна 1.

Я хочу, чтобы моя программа могла автоматически возвращать оценку для каждого слова из переменной «кандидаты» в паре со словами из переменной «семена» и зацикливать их вместе со строками в переменной «твиты».

#looping all pair candidates and seed to the tweets
for tweet in tweets:
    for candidate in candidates:
        for seed in seeds:
            if candidate in tweet and seed in tweet:
                if "happy" in tweet or "love" in tweet or "fun" in tweet:
                    print(candidate, seed, tweet)
                    count_happy += 1
                elif "sad" in tweet or "guilty" in tweet:
                    print(candidate, seed, tweet)
                    count_sad += 1
        count_a += 1

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

Вы просто подсчитываете количество слов? Кроме того, почему вы объединяете кандидатов в пары с семенами, если вы просто считаете их по отдельности?

Colin Ricardo 21.04.2018 11:55

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

Indra 21.04.2018 12:07

вы понимаете, о чем я?

Indra 21.04.2018 12:08

так что возьмем, к примеру, первое слово «ты». Я хочу соединить его со всеми словами из семян и перебрать их по всем предложениям из твитов и дать мне оценку для слова «ты» на основе того, сколько раз слово «ты» и его пары встречаются во всех предложениях.

Indra 21.04.2018 12:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот пример сценария того, что вы хотите сделать: то, что было сделано, добавляется каждый элемент-кандидат в словарь с ключом в качестве имени кандидата + строка всех семян. При просмотре семян я просто добавляю значение этого ключа с помощью + = 1

import codecs
import itertools
import threading
import csv


candidates = []
seeds = []
tweets = []
global lock

with codecs.open("d:\\untitled\\candidates.csv", encoding='utf8')  as candFile:
    readCSV = csv.reader(candFile, delimiter=',')
    for lines in candFile:
        if lines.rstrip() != "" :
            candidates.append(lines.rstrip())

with codecs.open("d:\\untitled\\seeds.csv",encoding='utf8')  as candFile:
    readCSV = csv.reader(candFile, delimiter=',')
    for lines in candFile:
        if lines.rstrip() != "" :
            seeds.append(lines.rstrip())

with codecs.open("d:\\untitled\\tweets.csv", encoding='utf8')  as candFile:
    readCSV = csv.reader(candFile, delimiter=',')
    for lines in candFile:
        if lines.rstrip() != "" :
            tweets.append(lines.rstrip())


counts = {}


def findMatch(listToWorkWith,tweet):
    for CS in listToWorkWith:
        if (CS[0] in tweet) and (CS[1] in tweet):
            try:
                counts[CS[0] + "+ All Seeds"] += 1
            except:
                counts[CS[0] + "+ All Seeds"] = 1


listOFAugrs = list(itertools.product(candidates, seeds))
lock = threading.Lock()
threads = [threading.Thread(target=findMatch, args=(listOFAugrs,x)) for x in tweets[0:10]]
for t in threads:
    t.start()
for t in threads:
    t.join()

print(counts)

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

Вывод для 10 твитов и всех комбинаций, например твитов [0:10]

{'jypetwic+ All Seeds': 2, 'twiceth+ All Seeds': 2, '5th+ All Seeds': 2, 'mini+ All Seeds': 2, 'albumltwhat+ All Seeds': 2, 'lovegtreleas+ All Seeds': 2, 'onlinemelon+ All Seeds': 2, 'twice+ All Seeds': 2, '트와이스+ All Seeds': 2, 'whatislov+ All Seeds': 2, 'u+ All Seeds': 16, 'voidtopaz+ All Seeds': 4, 'fandom+ All Seeds': 4, 'lolchoni+ All Seeds': 4, 'm+ All Seeds': 26, 'sinhuigang+ All Seeds': 2, 'rocket+ All Seeds': 2, 'confid+ All Seeds': 2, 'gayfal+ All Seeds': 2, 'distinguish+ All Seeds': 2, 'gaymi+ All Seeds': 2, 'gay+ All Seeds': 2, 'and+ All Seeds': 11, 're+ All Seeds': 7, 'morwennajh+ All Seeds': 3, 'imagin+ All Seeds': 3, 'painthi+ All Seeds': 3, 'darl+ All Seeds': 3, 'boy+ All Seeds': 6, 'inbut+ All Seeds': 3, 'need+ All Seeds': 3, 'chanc+ All Seeds': 3, 'liveco+ All Seeds': 3, 'singet+ All Seeds': 3, 'get+ All Seeds': 7, 'de+ All Seeds': 9, 'ed+ All Seeds': 3, 'akoposimarcelo+ All Seeds': 1, 'dontdont+ All Seeds': 1, 'deservem+ All Seeds': 1, 'im+ All Seeds': 7, 'live+ All Seeds': 3, 'ke+ All Seeds': 7, 'but+ All Seeds': 3, 'ur+ All Seeds': 10, 'htapmenami+ All Seeds': 5, 'alway+ All Seeds': 5, 'saturday+ All Seeds': 4, 'invit+ All Seeds': 4, 'friend+ All Seeds': 4, 'teach+ All Seeds': 4, 'magicyou+ All Seeds': 4, 'llanowar+ All Seeds': 4, 'elv+ All Seeds': 4, 'promo+ All Seeds': 4, 'll+ All Seeds': 4, 'or+ All Seeds': 5, 'y+ All Seeds': 21, 'p+ All Seeds': 24, 'imag+ All Seeds': 3, 'badrepseokjin+ All Seeds': 2, 'loop+ All Seeds': 2, 'jin+ All Seeds': 2, 'say+ All Seeds': 2, 'korean+ All Seeds': 2, 'english+ All Seeds': 2, 'vid+ All Seeds': 2, 'cr+ All Seeds': 2, 'eundaromi+ All Seeds': 2, 'r+ All Seeds': 26, 'abl+ All Seeds': 5, 'harder+ All Seeds': 5, 'end+ All Seeds': 4, 'sat+ All Seeds': 4, 'h+ All Seeds': 22, 'id+ All Seeds': 8, 'ab+ All Seeds': 5, 'yo+ All Seeds': 7, 'dr+ All Seeds': 2, 'gu+ All Seeds': 5, 'oc+ All Seeds': 2, 'con+ All Seeds': 5, 'f+ All Seeds': 13, 'v+ All Seeds': 25, 'ad+ All Seeds': 3, 'sh+ All Seeds': 4, 'ou+ All Seeds': 7, 'ive+ All Seeds': 3, 'don+ All Seeds': 1, 'n+ All Seeds': 27, 'rock+ All Seeds': 2, 'bu+ All Seeds': 5, 'neadawn808+ All Seeds': 1, 'soo+ All Seeds': 1, 'paint+ All Seeds': 3, 'sin+ All Seeds': 5, 'releas+ All Seeds': 2, 'twic+ All Seeds': 2, 'deserv+ All Seeds': 1, 'sa+ All Seeds': 6, 'l+ All Seeds': 27, 'way+ All Seeds': 5, 'album+ All Seeds': 2, 'melon+ All Seeds': 2, 'k+ All Seeds': 13, 'j+ All Seeds': 11, 've+ All Seeds': 21, 'gucciboytaeba+ All Seeds': 3, 'pass+ All Seeds': 3, 'second+ All Seeds': 3, 'bc+ All Seeds': 3, 'your+ All Seeds': 3, 'th+ All Seeds': 5, 'd+ All Seeds': 25, 'ig+ All Seeds': 2, 'life+ All Seeds': 3, 'go+ All Seeds': 3, 'stress+ All Seeds': 3, 'time+ All Seeds': 3, 'rn+ All Seeds': 3, 'nb+ All Seeds': 3, 'pa+ All Seeds': 10, 'eu+ All Seeds': 2, 'jh+ All Seeds': 3, 'vi+ All Seeds': 6, 'en+ All Seeds': 14, 'ok+ All Seeds': 7, 'b+ All Seeds': 15, 'c+ All Seeds': 21, 'magic+ All Seeds': 4, 'dese+ All Seeds': 1, 'hu+ All Seeds': 2, 'g+ All Seeds': 16, 'op+ All Seeds': 7, 'w+ All Seeds': 15, 'co+ All Seeds': 12, 'ar+ All Seeds': 15, 'fr+ All Seeds': 4, 'ma+ All Seeds': 8, 'e+ All Seeds': 27, 'o+ All Seeds': 27, 'fa+ All Seeds': 6, 'int+ All Seeds': 3, 'ea+ All Seeds': 9, 'bo+ All Seeds': 6, 'ang+ All Seeds': 2, 'di+ All Seeds': 2, 'bro+ All Seeds': 5, 'kor+ All Seeds': 2, 'la+ All Seeds': 4, 'bum+ All Seeds': 2, 'ti+ All Seeds': 7, 'lov+ All Seeds': 18, 'se+ All Seeds': 6, 'dis+ All Seeds': 2, 'ng+ All Seeds': 7, 'lo+ All Seeds': 18, 'und+ All Seeds': 2, 'aint+ All Seeds': 3, 'kore+ All Seeds': 2, 'rom+ All Seeds': 6, 'li+ All Seeds': 10, 'aro+ All Seeds': 2, 'korea+ All Seeds': 2, 'el+ All Seeds': 7, 'ko+ All Seeds': 3, 'al+ All Seeds': 13, 'pro+ All Seeds': 4, 'na+ All Seeds': 8, 'un+ All Seeds': 2, 'lan+ All Seeds': 4, '8+ All Seeds': 1, 'rea+ All Seeds': 2, 'serv+ All Seeds': 1, 'mor+ All Seeds': 3, 'ain+ All Seeds': 3, 'prom+ All Seeds': 4, 'men+ All Seeds': 5, 'tu+ All Seeds': 4, 'ov+ All Seeds': 18, 'mo+ All Seeds': 7, 'pm+ All Seeds': 5, 'mag+ All Seeds': 7, 'sing+ All Seeds': 3, 'gang+ All Seeds': 2, 'ht+ All Seeds': 5, 'ch+ All Seeds': 13, 'te+ All Seeds': 4, 'ting+ All Seeds': 2, 'jyp+ All Seeds': 2, 'thi+ All Seeds': 3, 'ep+ All Seeds': 2, 'anc+ All Seeds': 3, 'st+ All Seeds': 5, 'rd+ All Seeds': 12, 'wha+ All Seeds': 2, 'han+ All Seeds': 3, 'br+ All Seeds': 5, 'wa+ All Seeds': 9, 'in+ All Seeds': 13, 'seokjin+ All Seeds': 2, 'gi+ All Seeds': 7, 'fi+ All Seeds': 2, 'ay+ All Seeds': 13, 'mi+ All Seeds': 11, 'tin+ All Seeds': 2, 'mu+ All Seeds': 3, 'da+ All Seeds': 10, 'cha+ All Seeds': 5, 'ri+ All Seeds': 4, 'oy+ All Seeds': 10, 'mar+ All Seeds': 1, 'nda+ All Seeds': 2, 'ngl+ All Seeds': 2, 'rep+ All Seeds': 2, 'ho+ All Seeds': 4, 'ima+ All Seeds': 4, 'seo+ All Seeds': 2, 'ne+ All Seeds': 6, 'res+ All Seeds': 3, 'lea+ All Seeds': 2, 'turd+ All Seeds': 4, 'et+ All Seeds': 11, 'fe+ All Seeds': 3, 'tim+ All Seeds': 3, '5+ All Seeds': 2, 'fri+ All Seeds': 4, 'line+ All Seeds': 2, 'gt+ All Seeds': 2, 'ro+ All Seeds': 13, 'liv+ All Seeds': 3, 'si+ All Seeds': 6, 'ba+ All Seeds': 5, 'wh+ All Seeds': 2, 'jype+ All Seeds': 2, 'dom+ All Seeds': 4, 'chao+ All Seeds': 2, 'nd+ All Seeds': 13, 'ji+ All Seeds': 2, 'whati+ All Seeds': 2, 'ac+ All Seeds': 4, 'eth+ All Seeds': 2, 'aj+ All Seeds': 3, 'deser+ All Seeds': 1, 'ai+ All Seeds': 3, 'wi+ All Seeds': 2, 'em+ All Seeds': 3, 'cc+ All Seeds': 3, 'ag+ All Seeds': 7, 'what+ All Seeds': 2, 'om+ All Seeds': 10, 'onlin+ All Seeds': 2, 'eco+ All Seeds': 6, 'ove+ All Seeds': 18, 'lon+ All Seeds': 2, 'ot+ All Seeds': 2, 'ol+ All Seeds': 8, 'le+ All Seeds': 2, 'az+ All Seeds': 4, 'pet+ All Seeds': 2, 'ie+ All Seeds': 4, 'ae+ All Seeds': 3, 'dre+ All Seeds': 2, 'chan+ All Seeds': 3, 'po+ All Seeds': 1, 'min+ All Seeds': 2, 'gin+ All Seeds': 3, 'eng+ All Seeds': 2, 'ine+ All Seeds': 2, 'mur+ All Seeds': 3, 'ak+ All Seeds': 1, 'aw+ All Seeds': 1, 'tap+ All Seeds': 5, 'ci+ All Seeds': 3, 'nee+ All Seeds': 3, 'onl+ All Seeds': 2, 'lt+ All Seeds': 2, 'ce+ All Seeds': 3, 'um+ All Seeds': 2, 'ako+ All Seeds': 1, 'ap+ All Seeds': 5, '0+ All Seeds': 1, 'arc+ All Seeds': 1, 'tr+ All Seeds': 5, 'bl+ All Seeds': 5, 'har+ All Seeds': 5, 'rel+ All Seeds': 2, 'ice+ All Seeds': 2, 'tae+ All Seeds': 3, 'gucci+ All Seeds': 3, 'ni+ All Seeds': 6, 'ta+ All Seeds': 8, 'twi+ All Seeds': 2, 'fu+ All Seeds': 3, 'pe+ All Seeds': 2, 'hati+ All Seeds': 2, 'tw+ All Seeds': 2, 'pos+ All Seeds': 1, 'ami+ All Seeds': 5, 'vo+ All Seeds': 4, 'lif+ All Seeds': 3, 'sim+ All Seeds': 1, 'cond+ All Seeds': 3, 'yt+ All Seeds': 3, 'void+ All Seeds': 4, 'relea+ All Seeds': 2, 'whatislo+ All Seeds': 2, 'dawn+ All Seeds': 1, 'sec+ All Seeds': 3, 'ml+ All Seeds': 2, 'eas+ All Seeds': 2, '80+ All Seeds': 1, 'nam+ All Seeds': 5, 'econ+ All Seeds': 3, 'ada+ All Seeds': 1, 'ont+ All Seeds': 1, 'posi+ All Seeds': 1, 'ib+ All Seeds': 3, 'lb+ All Seeds': 2, 'seco+ All Seeds': 3, 'veg+ All Seeds': 2, 'isl+ All Seeds': 2, 'hat+ All Seeds': 2}

это в точности то, чем я хочу заниматься! но могу я спросить вас еще об одном как разделить их между категориями? так, например, вы + все семена появляются в счастливой категории 3 раза и в грустной категории 2 раза. возможно ли это сделать?

Indra 21.04.2018 12:20

Привет @toheedNiaz есть ли способ заставить скрипт работать быстрее? Я пробовал использовать 1000 слов в качестве кандидатов, 1000 слов в качестве начальных и 1000 слов в качестве твитов, и это занимает слишком много времени, чтобы получить результат. у тебя есть идеи, как заставить его работать быстрее?

Indra 22.04.2018 09:39

позволь мне посмотреть, что я могу для тебя сделать

toheedNiaz 22.04.2018 09:43

ух ты! Большое спасибо @toheedNiaz, извините за то, что попросил вас помочь мне с этим.

Indra 22.04.2018 09:48

привет @toheedNiaz, вы придумали решение?

Indra 22.04.2018 16:26

Немного занят, обновлю ответ при первой же возможности

toheedNiaz 22.04.2018 16:27

Ах хорошо. извините за беспокойство @toheedNiaz :)

Indra 22.04.2018 16:46

не стесняйтесь помочь мне, когда вы закончите со всеми своими задачами. :)

Indra 22.04.2018 16:46

вы можете попробовать приведенный выше код? увеличьте пул, чтобы запустить его в большем количестве потоков от 10 до большего значения, если вы думаете, что он медленный

toheedNiaz 22.04.2018 23:19

30 минут на обработку 1000 кандидатов, 5 часов на обработку 10000 кандидатов. @toheedNiaz. это как-то намного быстрее, но все же требует много времени.

Indra 23.04.2018 07:21

Можете ли вы поделиться набором образцов f кандидатов и предоставить ссылку здесь

toheedNiaz 23.04.2018 08:18
dropbox.com/s/uq52o23ulz5vyy0/… вот кандидаты, семена и твиты, которые я использую.
Indra 23.04.2018 09:10

вы придумали решение, чтобы помочь мне?

Indra 24.04.2018 09:56

спасибо за обновленное решение. теперь он работает лучше. У меня только одна проблема. функция findMatch возвращает только кандидатов, которые появляются вместе с начальными числами в твитах. кандидаты, которые не появляются вместе с семенами в твитах, не попадают в словарь. я хочу поставить их также со значением 0. возможно ли это?

Indra 03.05.2018 18:43

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

candidates = ["you", "the", "best", "love", "fun", "feeling", "emotionally"]
seeds = ["happy", "love", "enjoy", "fun", "grace", "sad", "guilty"]
tweets = ["you look so happy", "I am in love with you", "hey you do the best at having fun okay", "i am emotionally sad right now", "feeling guilty"]

    dic = {}
    for candidate in candidates:
        for seed in seeds:
            dic[(candidate,seed)] = 0

    for tweet in tweets:
        for elem in dic:
            if elem[0] in tweet and elem[1] in tweet:
                dic[elem] += 1

    print dic

вывод:

('the', 'fun'): 1, ('emotionally', 'fun'): 0, ('the', 'grace'): 0, ('love', 'fun'): 0, ('feeling', 'happy'): 0, ('best', 'fun'): 1, ('best', 'sad'): 0, ('you', 'enjoy'): 0, ('love', 'sad'): 0, ('fun', 'love'): 0, ('the', 'happy'): 0, ('best', 'happy'): 0, ('you', 'love'): 1, ('emotionally', 'sad'): 1, ('feeling', 'sad'): 0, ('love', 'happy'): 0, ('fun', 'enjoy'): 0, ('feeling', 'enjoy'): 0, ('the', 'guilty'): 0}

Теперь применять лечение стало проще.

Обновлено:

Не супер оптимизированный, но он должен быть лучше, и он классифицируется:

candidates = ["you", "the", "best", "love", "fun", "feeling", "emotionally"]
seeds = ["happy", "love", "enjoy", "fun", "grace", "sad", "guilty"]
tweets = ["you look so happy", "I am in love with you", "hey you do the best at having fun okay",
          "i am emotionally sad right now", "feeling guilty"]
dico = {}
for tweet in tweets:
    seeds_list = []
    candidates_list = []
    for word in tweet.split(' '):
        if word in seeds:
            seeds_list.append(word)
        if word in candidates:
            candidates_list.append(word)

    for seed in seeds_list:
        if seed not in dico:
            dico[seed] = len(candidates_list)
        else:
            dico[seed] += len(candidates_list)

выход:

{'sad': 1, 'happy': 1, 'fun': 4, 'guilty': 1, 'love': 2}

большое спасибо за ответ. Я имею в виду, что хочу разделить результат по категориям. взгляните на слова в переменных семенах. если вы посмотрите на них, слова разделятся на два вида слов. счастливые слова категории один и грустные слова категории. если возможно, я хочу знать, сколько раз слово из кандидата встречается в строках, и разделить их по категориям. ты понимаешь о чем я?

Indra 21.04.2018 17:35

('ты', 'счастливый'): 1, ('ты', 'любовь'): 1, ('ты', 'наслаждайся'): 0, ('ты', 'веселье'): 1, (' you ',' grace '): 0, (' you ',' sad '): 0, (' you ',' guilty '): 0 из этого результата вы можете сказать, что слово "you" набрало 3 балла в паре с счастливое слово и повторяет их по предложениям и набирает 0 баллов в сочетании с грустным словом и повторяет их по предложениям. Я хочу иметь возможность получать баллы по каждой категории эмоций, если это возможно. :)

Indra 21.04.2018 17:39

Привет @FlorentY есть ли способ ускорить работу скрипта? Я пробовал использовать 1000 слов в качестве кандидатов, 1000 слов в качестве начальных и 1000 слов в качестве твитов, и это занимает слишком много времени, чтобы получить результат. у тебя есть идеи, как заставить его работать быстрее?

Indra 22.04.2018 09:39

Другие вопросы по теме