нужна помощь, ребята. Нужно векторизовать список,
то есть заменить каждый элемент подсписка определенным вычисленным числом. Формула для каждого элемента подсписка https://i.stack.imgur.com/73xj9.png
Список имеет следующую структуру: list = [[document0],[document1],[document2],[document3].......]
Каждый документ состоит из терминов, например document1 = ['i','love','you']
Я написал свою функцию для расчета, но она работает некорректно :(
def tfc(slova):
import math as m
meshokslov1=[{}for i in range(len(slova))]
meshokslov2=[{}for i in range(len(slova))]
SummaKvadratov=0
for i in range(len(slova)):
for j in range(len(slova[i])):
n=0
for q in slova:
if q.count(slova[i][j])!=0:
n+=1
if slova[i][j] in meshokslov1:
continue
else:
meshokslov1[i][slova[i][j]]=slova[i].count(slova[i][j])*m.log10(len(slova)/n)
SummaKvadratov+=(slova[i].count(slova[i][j])*m.log10(len(slova)/n))**2
for i in range(len(slova)):
for j in range(len(slova[i])):
if slova[i][j] in meshokslov2:
continue
else:
meshokslov2[i][slova[i][j]]=meshokslov1[i][slova[i][j]]/(SummaKvadratov**0.5)
return meshokslov2
@VasilisG. Например list = [['Я', 'помогу'], ['буду', 'ты']] out list = [[0.707,0.707], [0.707,0.707]] radikal.ru/lfp/c.radikal.ru/c38/1804/2d/b8570fca9427.png/htm






Вот решение вашей проблемы, основанное на нисходящем дизайне:
import math
def frequency(term, document):
return document.count(term) / len(document)
def totalNumOfDocuments(inList):
return len(inList)
def numOfDocumentsForTerm(inList, term):
return len([doc for doc in inList if term in doc])
def TFCWeighting(inList):
tfc = []
N = totalNumOfDocuments(inList)
for document in inList:
temp = []
for term in document:
#numerator
freq = frequency(term, document)
n = numOfDocumentsForTerm(inList, term)
logarithm = math.log(N/n)
numerator = freq * logarithm
#denominator
summation = sum([(frequency(t, document) * math.log(N / numOfDocumentsForTerm(inList, term))) ** 2 for t in document])
denominator = math.sqrt(summation)
temp.append(round(numerator / denominator,3))
tfc.append(temp)
return tfc
l1=[['can','help','you'],['thank','you'],['help','help','help','help','help','help']]
l2=[['I','help'],['will','you']]
print(TFCWeighting(l1))
print(TFCWeighting(l2))
Выход:
[[0.577, 0.577, 0.577], [0.707, 0.707], [0.408, 0.408, 0.408, 0.408, 0.408, 0.408]]
[[0.707, 0.707], [0.707, 0.707]]
Вы правы, удалите. Строка terms = getAllTerms(inList), а затем цикл for t in terms при вычислении результата выполняет ту же работу.
Подождите, мне также нужно взять длину одного конкретного документа и суммировать по этой длине, а не длину всех терминов из всех документов. Например, l = [['I', 'help', 'qwer'], ['will', 'you']] M для первого документа = 3, для второго = 2
Можете ли вы опубликовать ожидаемый результат вышеизложенного?
list = [['can', 'help', 'you'], ['thank', 'you'], ['help', 'help', 'h elp', 'help', 'помогите', ' help']] OUT = [[0,577 0,577 0,577] [0,707 0,707] [0,408 0,408 0,408 0,408 0,408 0,408]]
@ Василис Г. спасибо. Можно как-нибудь оптимизировать функции для расчета? для 25000 документов вычислительный процесс бесконечен
Не могли бы вы привести пример с образцом ввода и ожидаемым результатом?