@vante_scribaxxi

Как каждому keyword подобрать одну сгенерированную статью из 10к?

1. Есть файл с 1000 кейвордами, взятыми прямо с wordstat
2. С помощью шаблона сгенерировано 10 тыс статей. В шаблоне использовались все кейворды, но в немного измененном виде.
3. Необходимо склеить каждый кейворд с тематической статьей.
Мое решение:
1. Разбить все статьи по словам, предварительно убрав весь шлак. Далее найти TF-IDF каждого из них
2. Сделать тоже самое с кейвордами
3. Последовательно в каждом кейворде брать самое важное слово (где больший TF-IDF) и искать это слово по всем статьям. Значение TF-IDF слова в статье сохранять в dict вместе с номером статьи, а затем выбрать статью с максимальным значением.
#coding:utf8

from collections import Counter
import operator
import math
import re

def compute_tfidf(corpus):
	def compute_tf(text):
		tf_text = Counter(text)
		for i in tf_text:
			tf_text[i] = tf_text[i]/float(len(text))
		return tf_text

	def compute_idf(word, corpus):
		return math.log10(len(corpus)/sum([1.0 for i in corpus if word in i]))

	documents_list = []
	for text in corpus:
		tf_idf_dictionary = {}
		computed_tf = compute_tf(text)
		for word in computed_tf:
			tf_idf_dictionary[word] = computed_tf[word] * compute_idf(word, corpus)
		documents_list.append(tf_idf_dictionary)

	return documents_list

texts = [a for a in open("texts.txt", encoding="utf8").read().split("\n")[:50] if a]
keywords = [a for a in open("keywords.txt", encoding="utf8").read().split("\n") if a]


kw_plus_text = {}
texts_tfidf = compute_tfidf([re.findall("\w+", t.lower()) for t in texts])
keywords_tfidf = compute_tfidf([re.findall("\w+", k.lower()) for k in keywords])
for z, kw in enumerate(keywords_tfidf):
	#Получаем самое важное слово в keyword
	words = sorted(kw.items(), key=operator.itemgetter(1))
	w = words[0][0]#Выбераем самое тяжелое слово в вфразе. Второй нуль оставляет только само слово, т.к. его TF-IDF в корпусе ключивиков не пригодится
	#Подготавливаем dict для записи результатов индексации
	results = {}
	for i, tx in enumerate(texts_tfidf):
		#Если индексируемое слово есть в тексте, тогда относим вес слова в тексте как степень реливантности всего текста к ключивику
		if w in dict(tx):
			print(w)
			results[i] = dict(tx)[w]
		#Если же слова в тексте нету, то записываем реливантность 0
		else:
			results[i] = 0
	#Сортируем список проиндексированных статей по возрастанию и получаем index самой реливантной статьи (т.е. самой последней в списке)
	index = sorted(results.items(), key=operator.itemgetter(1))[-1][0]#В результатах в ячейке 0 хранится номер статьи, а в ячейке 1 его вес, который уже не нужен
	print(index)
	#Заносим в базу данных - кейворд и текст
	kw_plus_text[keywords[z]] = texts[index]
open("sorted_content.txt", "w", encoding="utf8").write("\n".join(["%s\n%s" % (k, kw_plus_text[k]) for k in kw_plus_text]))
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы