n8n - algallikate kogumine.md 11 KB

Alustan n8n-iga, kuna see on sul juba installitud ja töötab. See on kiireim viis prototüüpida allikate kogumist ja töötlemist.

Siin on kaks konkreetset n8n töövoo näidet ja Pythoni alternatiiv:

VALIK 1: n8n töövoog algallikate kogumiseks

A. Lihtne töövoog: RSS → tekst → PostgreSQL

See töövoog kogub uusi artikleid RSS-ist, parsib sisu ja salvestab PostgreSQL-i.

Sõlmed:

  1. RSS Feed Read - seadista RSS-iga (nt arXiv, DOAJ, Google Scholar RSS)
  2. If - filtreeri võtmesõnade järgi (nt "ethnomathematics", "indigenous mathematics")
  3. Read PDF - lae alla PDF-d (kui on)
  4. Extract from PDF - parsib teksti PDF-ist
  5. Extract from Web - kui pole PDF, võta veebilehe sisu
  6. PostgreSQL - salvesta source tabelisse

Näidis konfiguratsioonist:

RSS Feed Read sõlm:

Feed URL: https://export.arxiv.org/rss/math.HO

If sõlm:

Condition: {{ $json.description.includes("ethnomathematics") }}

PostgreSQL sõlm (Source tabeli jaoks):

INSERT INTO etnomath.source 
(author, year, type, citation, doi_url, reliability_assessment, notes)
VALUES 
($1, $2, $3, $4, $5, $6, $7)

Parameters:

$1: {{ $json.author }}
$2: {{ $json.pubDate.slice(0,4) }}
$3: 'article'
$4: {{ $json.title + " - " + $json.link }}
$5: {{ $json.link }}
$6: 'keskmine'
$7: {{ "RSS: " + $json.feed }}

B. Täiendatud töövoog: failide töötlus ja vektorid

Kui tahad lisada embeddinguid pgvector-i, siis:

  1. Read Binary Files - loe failid kaustast /backups/docker/postgres/sources/
  2. Extract Text - kasuta PyMuPDF või unstructured
  3. Split Text - tükeldamine 500 tähemärki
  4. HTTP Request - kutsu OpenAI embed API või lokaalne embedder
  5. PostgreSQL - salvesta source_chunk ja chunk_embedding

VALIK 2: Pythoni kood (paindlikum)

allikate_koguja.py

import requests
from bs4 import BeautifulSoup
import arxiv
import json
from datetime import datetime
import psycopg2
from psycopg2.extras import execute_values
import os

class SourceCollector:
    def __init__(self):
        self.db_conn = psycopg2.connect(
            host="localhost",
            database="ethnomath",
            user="osm",
            password="osm"
        )
        self.sources_dir = "/backups/docker/postgres/sources"
        os.makedirs(self.sources_dir, exist_ok=True)
    
    def search_arxiv(self, query="ethnomathematics", max_results=10):
        """Otsi arXiv-ist"""
        client = arxiv.Client()
        search = arxiv.Search(
            query=query,
            max_results=max_results,
            sort_by=arxiv.SortCriterion.SubmittedDate
        )
        
        sources = []
        for result in client.results(search):
            source = {
                "author": ", ".join([a.name for a in result.authors]),
                "year": result.published.year,
                "type": "preprint",
                "citation": f"{result.title}. {result.authors[0].name if result.authors else 'Unknown'}",
                "doi_url": result.entry_id,
                "reliability_assessment": "keskmine",
                "notes": f"arXiv: {result.primary_category}. Abstract: {result.summary[:200]}...",
                "full_text": None,
                "pdf_url": result.pdf_url
            }
            sources.append(source)
        
        return sources
    
    def search_doaj(self, query="ethnomathematics", rows=10):
        """Otsi DOAJ-ist (Directory of Open Access Journals)"""
        url = f"https://doaj.org/api/v2/search/articles/{query}?pageSize={rows}"
        response = requests.get(url)
        
        sources = []
        if response.status_code == 200:
            data = response.json()
            for article in data.get('results', []):
                source = {
                    "author": ", ".join(article.get('bibjson', {}).get('author', [])),
                    "year": article.get('bibjson', {}).get('year'),
                    "type": "journal_article",
                    "citation": article.get('bibjson', {}).get('title', ''),
                    "doi_url": article.get('bibjson', {}).get('identifier', [{}])[0].get('id', ''),
                    "reliability_assessment": "kõrge",  # DOAJ on peer-reviewed
                    "notes": f"Journal: {article.get('bibjson', {}).get('journal', {}).get('title', '')}",
                    "full_text": None
                }
                sources.append(source)
        
        return sources
    
    def save_to_db(self, sources):
        """Salvesta andmebaasi"""
        cur = self.db_conn.cursor()
        
        query = """
        INSERT INTO etnomath.source 
        (author, year, type, citation, doi_url, reliability_assessment, notes)
        VALUES %s
        RETURNING id
        """
        
        values = []
        for s in sources:
            values.append((
                s.get('author'),
                s.get('year'),
                s.get('type'),
                s.get('citation'),
                s.get('doi_url'),
                s.get('reliability_assessment'),
                s.get('notes')
            ))
        
        if values:
            execute_values(cur, query, values)
            self.db_conn.commit()
            print(f"Salvestatud {len(values)} allikat.")
        
        cur.close()
    
    def download_pdf(self, pdf_url, source_id):
        """Lae PDF alla ja salvesta failisüsteemi"""
        try:
            response = requests.get(pdf_url)
            filename = f"{source_id}_{datetime.now().strftime('%Y%m%d')}.pdf"
            filepath = os.path.join(self.sources_dir, filename)
            
            with open(filepath, 'wb') as f:
                f.write(response.content)
            
            return filepath
        except:
            return None
    
    def run_collection(self):
        """Käivita kogumine"""
        print("Alustan allikate kogumist...")
        
        # 1. Otsi arXiv-ist
        print("1. Otsin arXiv-ist...")
        arxiv_sources = self.search_arxiv()
        
        # 2. Otsi DOAJ-ist
        print("2. Otsin DOAJ-ist...")
        doaj_sources = self.search_doaj()
        
        # 3. Ühenda kõik allikad
        all_sources = arxiv_sources + doaj_sources
        print(f"Leidsin {len(all_sources)} allikat.")
        
        # 4. Salvesta andmebaasi
        self.save_to_db(all_sources)
        
        # 5. Lae PDF-id (valikuline)
        for i, source in enumerate(all_sources[:5]):  # Esimesed 5
            if source.get('pdf_url'):
                filepath = self.download_pdf(source['pdf_url'], i+1)
                if filepath:
                    print(f"  PDF allalaaditud: {filepath}")
        
        print("Kogumine lõpetatud.")
        self.db_conn.close()

if __name__ == "__main__":
    collector = SourceCollector()
    collector.run_collection()

requirements.txt selle jaoks:

requests>=2.31.0
beautifulsoup4>=4.12.0
arxiv>=2.0.0
psycopg2-binary>=2.9.0
PyPDF2>=3.0.0
python-dotenv>=1.0.0

VALIK 3: Kombineeritud lähenemine (soovitan)

n8n + Python skriptid

Jagage töö järgmiselt:

n8n teeb Python teeb
RSS jälgimine Teksti tükeldamine
Failide monitor Embeddingud
Põhiline parsijut Keerulised parsijad
Andmebaasi salvestus Matemaatiline analüüs
Teavitused Allikate hindamine

Konkreetne plaan:

  1. n8n töövoog 1 - "Uute allikate jälgimine"

    • RSS Feed Read (arXiv, DOAJ, Google Scholar)
    • HTTP Request (kohandatud API-dele)
    • If (filtreeri olulised)
    • PostgreSQL (lisa source tabelisse)
  2. n8n töövoog 2 - "Failide töötlus"

    • Read Binary Files (kataloogist)
    • Extract from PDF
    • Split Text
    • Execute Command (käivita Python skript embeddinguteks)
  3. Python skript - process_sources.py

    # 1. Võta töötlemata allikad DB-st
    # 2. Tee embeddingud
    # 3. Tükelda ja salvesta chunkid
    # 4. Uuenda source tabelit
    
  4. n8n töövoog 3 - "Kvaliteedikontroll"

    • Cron (käivita iga nädal)
    • PostgreSQL (leia allikad ilma täistekstita)
    • HTTP Request (proovi leida täisteksti)
    • If (kui leiad, uuenda)

MINU SOOVITUS SULLE:

Kuna sul on n8n juba installitud, alusta sellega:

Samm 1 (täna): n8n põhitöövoog

  1. Loo RSS-jälgija arXiv math.HO jaoks
  2. Filtreeri "ethnomathematics", "indigenous", "traditional mathematics"
  3. Salvesta PostgreSQL-i source tabelisse

Samm 2 (nädal 1): PDF töötlus

  1. Loo töövoog, mis loeb failid kaustast
  2. Kasuta "Extract from PDF" sõlme
  3. Salvesta tekst source_chunk tabelisse

Samm 3 (nädal 2): Python täiendused

  1. Kirjuta skript embeddingute tegemiseks
  2. Käivita seda n8n "Execute Command" kaudu
  3. Logi tulemused

Samm 4 (nädal 3): Integreerimine

  1. Ühenda kõik töövoogud
  2. Loo notifikatsioonid (nt Slack, email)
  3. Lisa käsitsi kontrolli sõlm

Esimese n8n töövoo sammud:

  1. Ava n8n (localhost:5678)
  2. Loo uus töövoog
  3. Lisa "RSS Feed Read" sõlm
    • Feed URL: https://export.arxiv.org/rss/math.HO
    • Limit: 20
  4. Lisa "If" sõlm
    • Condition 1: {{ $json.title.includes("ethnomathematics") }}
    • Condition 2: {{ $json.summary.includes("indigenous") }}
    • Operation: OR
  5. Lisa "PostgreSQL" sõlm

    • Seadista ühendus sinu PostgreSQL-iga
    • Query: (kasuta ülal olevat INSERT-i)
  6. Lisa "Cron" sõlm algusesse

    • Käivita iga päev kell 09:00
  7. Salvesta ja käivita töövoog


Täiendavad allikad kogumiseks:

Automaatse kogumise jaoks:

  1. arXiv (matemaatika ajalugu): math.HO
  2. DOAJ - Directory of Open Access Journals
  3. Google Scholar RSS (kasuta Scholar API või n8n veebiparsijat)
  4. JSTOR API (kui sul on juurdepääs)
  5. Crossref API (teadusartiklite metaandmed)

Käsitsi lisamiseks:

  1. PDF-id kohalikust kaustast
  2. Veebilehed (n8n "HTTP Request" + "Extract from HTML")
  3. Markdown failid Obsidianist
  4. Zotero eksport (CSV või BibTeX)

Järgmised sammud pärast kogumist:

Kui sul on 10-20 allikat, siis:

  1. Proovi ühte uurimisküsimust - kasuta LangChaini, et luua küsimusi sinu allikate põhjal
  2. Tee lihtne otsing - otsi "sümmeetria" või "mustrid"
  3. Loo esimene käsikiri mustand - kasuta artikkel agenti

Kas soovid, et näitaksin:

  1. Täpsemat n8n töövoo konfiguratsiooni?
  2. Pythoni skripti, mis parsib Zotero ekspordi?
  3. Kuidas seada üles automaatne PDF allalaadimine?

Alusta n8n-iga - see annab sulle kohe tulemusi ilma palju programmeerimiseta. Pythoni võid lisada hiljem, kui vajad rohkem kontrolli.