Как найти термин "частота" определенного набора тегов в документе
Как я могу найти частоту каждой из этих аннотаций; Автор, год, язык, а также частоты появления их униграмм, биграмм, триграмм... нграмм, т.е.
"<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})