#!/usr/bin/env python # coding: utf-8 # ### Predstavitev besedil s terkami in ocenjevanje podobnosti besedil # Iz spletnega portala kopiramo nekaj člankov, in besedilo vsakega od teh shranimo v svojo datoteko v direktoriju `text-data`. Taki zbirki besedil pravimo korpus. Korpus shranimo v slovar, besedila pretvorimo v množico terk ter podobnost med besedili ocenimo z mero po Jaccardu. # In[1]: import glob import os.path from collections import Counter from itertools import combinations # In[2]: corpus = {} for file_name in glob.glob("text-data/*"): name = os.path.splitext(os.path.basename(file_name))[0] text = " ".join([line.strip() for line in open(file_name).readlines()]) text = text.lower() corpus[name] = text # In[3]: corpus.keys() # In[4]: corpus['potop'][:100] # In[5]: def kmers(s, k=3): """Generates k-mers for an input string.""" for i in range(len(s)-k+1): yield s[i:i+k] # In[6]: set(kmers("modra modrina neba")) # Dela! Spodaj iz slovarja besedil sestavimo slovar množice terk za vsako od slovarjev # In[7]: data = {k: set(kmers(corpus[k], 3)) for k in corpus} # In[8]: def jaccard(data, a, b): """Jaccard distance between two sets.""" return len(data[a] & data[b]) / len(data[a] | data[b]) # In[9]: test = {'a': {1,2,3,4}, 'b': {1, 3, 4}} jaccard(test, 'a', 'b') # Tudi podobnost po Jaccardu dela (za zgornja dva niza je podobnost enaka 3/4). Spodaj zmerimo podobnost za naše članke iz spletnega portala in razmislimo, ali je izračun smiselen. # In[10]: sorted([(jaccard(data, a, b), a, b) for a, b in combinations(data.keys(), 2)])