Как найти термин "частота" определенного набора тегов в документе

Как я могу найти частоту каждой из этих аннотаций; Автор, год, язык, а также частоты появления их униграмм, биграмм, триграмм... нграмм, т.е.

"<author>James Parker</author><year>2008</year><lang>English</lang>"
"<author>Van Wie</author><year>2002</year>"
"<year>2012</year><lang>English</lang>"
"<year>2002</year><lang>French</lang>"


 file = 'file.csv'
 df = pd.read_csv(file)               
 lines = df['query']
 for line in lines:    

     #calculate tag frequency

  #calculate frequencies of unigram, bigrams, trigrams,....ngram tags 

> author: 3, year: 4, lang: 3

  trigram: author, year, lang : 1
  bigram: author, year: 1
  bigram: year, lang: 2

1 ответ

Решение

Если я правильно читаю, вы считаете только 1 нграмм на строку, поэтому строка

"<author>James Parker</author><year>2008</year><lang>English</lang>" 

имеет триграмму и 3 униграммы. Вам не нужны все комбинации для каждой строки.

Самый простой способ подсчитать это - просто использовать словарь, к которому обращается тег или кортеж, для хранения счетчика. Это дает вам один проход и должен хорошо масштабироваться с количеством входных строк. Я использую регулярное выражение, чтобы вытащить первый из каждого тега (это означает, что вход должен быть правильно сформирован), а затем просто индексировать в счетчик по имени тега, а затем по n-кортежу, сформированному из набора имен тегов.

import collections
import re

string = """<author>James Parker</author><year>2008</year><lang>English</lang>
<author>Van Wie</author><year>2002</year>
<year>2012</year><lang>English</lang>
<year>2002</year><lang>French</lang>"""

strings = string.split("\n")
counter = collections.Counter()

tag_re = "\<[^/\>]*\>"
for s in strings:
    tags = re.findall(tag_re, s)
    tags.sort()
    # use name directly
    for tag in tags:
        counter[tag] += 1
    # use set for ngram
    ngram = tuple(tags)
    counter[ngram] += 1

print counter

Это печатает:

Counter({'<year>': 4, '<lang>': 3, '<author>': 2, ('<year>', '<lang>'): 2, ('<author>', '<year>'): 1, ('<author>', '<year>', '<lang>'): 1})
Другие вопросы по тегам