2017-02-16 63 views
16

Во-первых, давайте извлекать результаты TF-IDF за срок за документ:Устный сумму TF-IDF десятков слов между документами

from gensim import corpora, models, similarities 
documents = ["Human machine interface for lab abc computer applications", 
       "A survey of user opinion of computer system response time", 
       "The EPS user interface management system", 
       "System and human system engineering testing of EPS", 
       "Relation of user perceived response time to error measurement", 
       "The generation of random binary unordered trees", 
       "The intersection graph of paths in trees", 
       "Graph minors IV Widths of trees and well quasi ordering", 
       "Graph minors A survey"] 
stoplist = set('for a of the and to in'.split()) 
texts = [[word for word in document.lower().split() if word not in stoplist] for document in documents] 
dictionary = corpora.Dictionary(texts) 
corpus = [dictionary.doc2bow(text) for text in texts] 
tfidf = models.TfidfModel(corpus) 
corpus_tfidf = tfidf[corpus] 

Печать это:

for doc in corpus_tfidf: 
    print doc 

[выход]:

[(0, 0.4301019571350565), (1, 0.4301019571350565), (2, 0.4301019571350565), (3, 0.4301019571350565), (4, 0.2944198962221451), (5, 0.2944198962221451), (6, 0.2944198962221451)] 
[(4, 0.3726494271826947), (7, 0.27219160459794917), (8, 0.3726494271826947), (9, 0.27219160459794917), (10, 0.3726494271826947), (11, 0.5443832091958983), (12, 0.3726494271826947)] 
[(6, 0.438482464916089), (7, 0.32027755044706185), (9, 0.32027755044706185), (13, 0.6405551008941237), (14, 0.438482464916089)] 
[(5, 0.3449874408519962), (7, 0.5039733231394895), (14, 0.3449874408519962), (15, 0.5039733231394895), (16, 0.5039733231394895)] 
[(9, 0.21953536176370683), (10, 0.30055933182961736), (12, 0.30055933182961736), (17, 0.43907072352741366), (18, 0.43907072352741366), (19, 0.43907072352741366), (20, 0.43907072352741366)] 
[(21, 0.48507125007266594), (22, 0.48507125007266594), (23, 0.48507125007266594), (24, 0.48507125007266594), (25, 0.24253562503633297)] 
[(25, 0.31622776601683794), (26, 0.31622776601683794), (27, 0.6324555320336759), (28, 0.6324555320336759)] 
[(25, 0.20466057569885868), (26, 0.20466057569885868), (29, 0.2801947048062438), (30, 0.40932115139771735), (31, 0.40932115139771735), (32, 0.40932115139771735), (33, 0.40932115139771735), (34, 0.40932115139771735)] 
[(8, 0.6282580468670046), (26, 0.45889394536615247), (29, 0.6282580468670046)] 

Если мы хотим, чтобы найти «явнополюсность» или «значение» слов внутри этого корпуса, мы можем просто суммировать суммы очков tf-idf по всем документам и разделить их на количество документов? I.e.

>>> tfidf_saliency = Counter() 
>>> for doc in corpus_tfidf: 
...  for word, score in doc: 
...   tfidf_saliency[word] += score/len(corpus_tfidf) 
... 
>>> tfidf_saliency 
Counter({7: 0.12182694202050007, 8: 0.11121194156107769, 26: 0.10886469856464989, 29: 0.10093919463036093, 9: 0.09022272408985754, 14: 0.08705221175200946, 25: 0.08482488519466996, 6: 0.08143359568202602, 10: 0.07480097322359022, 12: 0.07480097322359022, 4: 0.07411881371164887, 13: 0.07117278898823597, 5: 0.07104525967490458, 27: 0.07027283689263066, 28: 0.07027283689263066, 11: 0.060487023243988705, 15: 0.055997035904387725, 16: 0.055997035904387725, 21: 0.05389680556362955, 22: 0.05389680556362955, 23: 0.05389680556362955, 24: 0.05389680556362955, 17: 0.048785635947490406, 18: 0.048785635947490406, 19: 0.048785635947490406, 20: 0.048785635947490406, 0: 0.04778910634833961, 1: 0.04778910634833961, 2: 0.04778910634833961, 3: 0.04778910634833961, 30: 0.045480127933079706, 31: 0.045480127933079706, 32: 0.045480127933079706, 33: 0.045480127933079706, 34: 0.045480127933079706}) 

Глядя на выходе, мы могли бы предположить, что наиболее «видным» слово в корпусе является:

>>> dictionary[7] 
u'system' 
>>> dictionary[8] 
u'survey' 
>>> dictionary[26] 
u'graph' 

Если да, то , что математическая интерпретация суммы TF-IDF множество слов по документам?

+0

Не могли бы вы добавить выход вашего 'dictionary' к вашему вопросу. Я хочу сделать сопоставление с моим «словарем», чтобы обновить таблицу вывода в моем ответе. – stovfl

+0

Ой, жаль, что я его не спас. Словарь был бы другим, потому что я использовал Python3, и словарь не то же самое, если я его повторно запустил. Но ранг слов должен быть детерминированным, поскольку он основан на статистических подсчетах, повторяет код gensim, и вы должны получить ту же самую «систему, обзор, график», что и верхняя часть. – alvas

+0

Извините, не удалось использовать gensim. – stovfl

ответ

1

Существует два контекста, которые могут быть рассчитаны в них.

  1. заметности в корпусе
  2. заметности в одном документе

заметности в корпусе просто может быть вычислена путем подсчета появлений конкретного слова в корпусе или обратного подсчета документов это слово появляется (IDF = частота инвертированного документа). Потому что слова, которые содержат конкретный смысл, не появляются повсюду.

значимость в документе рассчитывается по tf_idf. Потому что это состоит из двух видов информации. Глобальная информация (основанная на корпусе) и локальная информация (основанная на документах). Требование о том, что «слово с большей частотой в документе более важно в текущем документе» не является полностью истинным или ложным, поскольку оно зависит от глобальной значимости слова. В конкретном документе у вас есть много слов типа «это, есть, am, are, ...» с большими частотами. Но это слово не важно в любом документе, и вы можете воспринимать их как прекрасные слова!

---- редактировать ---

Знаменатель (= Len (corpus_tfidf)) является постоянной величиной и может быть проигнорирован, если вы хотите иметь дело с ordinality, а не мощности измерения. С другой стороны, мы знаем, что IDF означает Inverted Document Freqeuncy, поэтому IDF может быть переотложен на 1/DF. Мы знаем, что DF - это значение уровня корпуса, а TF - значение уровня документа. Суммирование TF-IDF превращает TF на уровне документа в TF корпуса. В самом деле суммирование равно этой формуле:

Количество (слово)/счетчик (документы содержат слово)

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

Я считаю, что эта формула не так полезна.

+0

Понятие «важности»/«значимости» внутри и между документами является TF-IDF, а IDF ясно из определений TF, IDF и TF-IDF. Но вы не ответили на то, что интерпретирует сумму TF-IDF по документам. P – alvas

0

Если мы хотим, чтобы найти «явнополюсность» или «значение» слов в пределах этот корпус, мы можем просто сделать сумму Tf-IDF баллов по всем документов и разделить его на количество документы? Если да, то какова математическая интерпретация суммы баллов TF-IDF в словах ?

Если вы суммировали оценки td-idf по документам, термины, которые в противном случае имели бы низкие баллы, могут получить повышение, а условия с более высокими баллами могут привести к депрессии.

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

Итак, математически, я ожидаю, что вы получите нежелательный эффект усреднения.

+0

Не будет ли нормализовать документацию при суммировании TF-IDF по документам в итоге с аналогичными номерами/эффектами с IDF? – alvas

+0

Я думаю, что это было бы похоже, но ожидало бы, что точность (как судить по человеческому) упадет. Я думаю о журнале веса N/n_term: n_term слишком легко перекошен, если документы не связаны в контексте. Хотя, это может быть нормально, если N достаточно велико? Может быть, вы можете провести ручное сравнение терминов с/без суммирования по первому документу? – avip

2

Интерпретация TF-IDF в корпусе - это самый высокий TF-IDF в корпусе для данного термина.

Найти лучшие слова в corpus_tfidf.

topWords = {} 
    for doc in corpus_tfidf: 
     for iWord, tf_idf in doc: 
      if iWord not in topWords: 
       topWords[iWord] = 0 

      if tf_idf > topWords[iWord]: 
       topWords[iWord] = tf_idf 

    for i, item in enumerate(sorted(topWords.items(), key=lambda x: x[1], reverse=True), 1): 
     print("%2s: %-13s %s" % (i, dictionary[item[0]], item[1])) 
     if i == 6: break 

Выход сравнения корзина
ПРИМЕЧАНИЕ: Could'n использовать gensim, чтобы создать соответствующий dictionary с corpus_tfidf.
Показать только Word Indizies.

Question tfidf_saliency topWords(corpus_tfidf) Other TF-IDF implentation 
--------------------------------------------------------------------------- 
1: Word(7) 0.121  1: Word(13) 0.640 1: paths   0.376019 
2: Word(8) 0.111  2: Word(27) 0.632 2: intersection 0.376019 
3: Word(26) 0.108  3: Word(28) 0.632 3: survey  0.366204 
4: Word(29) 0.100  4: Word(8)  0.628 4: minors  0.366204 
5: Word(9) 0.090  5: Word(29) 0.628 5: binary  0.300815 
6: Word(14) 0.087  6: Word(11) 0.544 6: generation 0.300815 

Расчет TF-IDF всегда учитывает корпус.

Испытано с Python: 3.4.2

+0

Как определяется «документ», является размытым. Я не думаю, что максимальная оценка tf-idf в наборе документов представляет собой tf-idf корпуса. – alvas

+0

Можете ли вы дать ссылку на * «Как определяется« документ », является размытым» *. Что вы думаете о: Score = Sum (tf-idf за членство в корпусе) – stovfl

+0

В случае предложений в корпусе - это предложение документа? Или группы предложений - документ? В случае TF-IDF, если TF вычисляется в масштабе всего тела (сумма по всем предложениям), является ли это tf-idf? Понятие документа, используемого в предложениях в корпусе, довольно размыто. – alvas

1

Это большая дискуссия. Спасибо, что начали эту тему. Идея включения длины документа в @avip кажется интересной. Придется экспериментировать и проверять результаты. Тем временем позвольте мне попытаться задать вопрос несколько иначе. Что мы пытаемся интерпретировать при запросе оценок релевантности TF-IDF?

  1. Возможно, пытаясь понять слово значимость на уровне документа
  2. Возможно, пытаясь понять слово значимости каждого класса
  3. Возможно, пытаясь понять слово актуальность в целом (в целом корпус)

    # # features, corpus = 6 documents of length 3 
    counts = [[3, 0, 1], 
          [2, 0, 0], 
          [3, 0, 0], 
          [4, 0, 0], 
          [3, 2, 0], 
          [3, 0, 2]] 
    from sklearn.feature_extraction.text import TfidfTransformer 
    transformer = TfidfTransformer(smooth_idf=False) 
    tfidf = transformer.fit_transform(counts) 
    print(tfidf.toarray()) 
    
    # lambda for basic stat computation 
    summarizer_default = lambda x: np.sum(x, axis=0) 
    summarizer_mean = lambda x: np.mean(x, axis=0) 
    
    print(summarizer_default(tfidf)) 
    print(summarizer_mean(tfidf)) 
    

Результат:

# Result post computing TF-IDF relevance scores 
array([[ 0.81940995, 0.  , 0.57320793], 
      [ 1.  , 0.  , 0.  ], 
      [ 1.  , 0.  , 0.  ], 
      [ 1.  , 0.  , 0.  ], 
      [ 0.47330339, 0.88089948, 0.  ], 
      [ 0.58149261, 0.  , 0.81355169]]) 

# Result post aggregation (Sum, Mean) 
[[ 4.87420595 0.88089948 1.38675962]] 
[[ 0.81236766 0.14681658 0.2311266 ]] 

Если мы внимательно наблюдаем, мы понимаем, что функция, которая произошла во всем документе, не игнорируется полностью, потому что добавлена ​​реализация sklearn idf = log [n/df (d, t)] + 1. +1 так что важное слово, которое так происходит во всем документе, не игнорируется. Например.слово «велосипед» происходит очень часто при классификации конкретного документа как «motorcyle» (20_newsgroup dataset).

  1. Сейчас в-отношении первых 2 вопроса, один пытается интерпретировать и понимать главные общие черты, которые могут иметь место в документе. В этом случае агрегирование в какой-либо форме, включая все возможные появления слова в документе, не воспринимает ничего, даже математически. ИМО такой запрос очень полезен, исследуя набор данных и помогая понять, что такое набор данных. Логика может быть применена и к векторизации с использованием Хейшинга.

    релевантность_score = среднее (tf (t, d) * idf (t, d)) = среднее ((смещение + inital_wt * F (t, d)/max {F (t ', d)}) * log (N/df (d, t)) + 1))

  2. Вопрос 3 очень важен, поскольку он может также способствовать созданию функций для построения модели прогнозирования. Просто использование оценок TF-IDF независимо для выбора функции может вводить в заблуждение на нескольких уровнях. Принятие более теоретического статистического теста, такого как пара «chi2» с оценкой релевантности TF-IDF, может быть лучшим подходом. Такой статистический тест также оценивает важность функции в отношении соответствующего целевого класса.

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

** Проблема здесь сложнее описать здесь. Но, надеясь, что это помогает. Что чувствуют другие?

Ссылка: https://arxiv.org/abs/1707.05261