Ik zit met een probleem dat niet echt moeilijk is als het om weinig data gaat, maar aangezien het om een aantal GB gaat, moet ik een efficiente manier vinden om woorden te tellen.
Ik moet de Term Frequency van woorden vinden, dat wil zeggen, ik moet tellen hoe vaak een bepaald woord voorkomt in een bepaalde tekst.
Om dit gewoon te schrijven is niet zo moeilijk, alleen kom ik bij al mijn oplossing uit op algoritmes die niet erg efficient zijn (hoge tijd-complexiteit)
Voorbeeldje: Stel de tekst:
uit: Principles of Data Mining, Manilla, Hand et al.
Ik heb een tekst in een String[], waarin elke woord een element is. Deze woorden zijn allemaal 'gecleaned' van rotzooi ASCII en gestemmed naar naar hun grondterm. Wat er dan moet uitkomen is, een gesorteerde lijst moet hoevaak elke term voorkomt:
Bij elke oplossing die ik verzin kom ik dus uit op een kwadratische (of slechtere) methode, maar volgens mijn gevoel moet dit ook sneller kunnen.
Ik gebruik Java hiervoor, dus heb wel een aantal handige Collections tot mijn beschikking, helaas kan een TreeMap bijvoorbeeld niet gebruikt worden omdat deze niet op Values kan sorteren en geen duplicate Keys kan bevatten. Een HashMap kan weer niet sorteren. Zelf een classe maken implements compterator, geeft problemen met het controleren of een term al bestaat, wat betekend dat je een lijst moet bijhouden en door die lijst moet lopen.
Ik moet de Term Frequency van woorden vinden, dat wil zeggen, ik moet tellen hoe vaak een bepaald woord voorkomt in een bepaalde tekst.
Om dit gewoon te schrijven is niet zo moeilijk, alleen kom ik bij al mijn oplossing uit op algoritmes die niet erg efficient zijn (hoge tijd-complexiteit)
Voorbeeldje: Stel de tekst:
uit: Principles of Data Mining, Manilla, Hand et al.
code:
1
| TF stands for Term Frequency and simply means that each term component in a term vector is multiplied by the frequency by which that term occurs in the document |
Ik heb een tekst in een String[], waarin elke woord een element is. Deze woorden zijn allemaal 'gecleaned' van rotzooi ASCII en gestemmed naar naar hun grondterm. Wat er dan moet uitkomen is, een gesorteerde lijst moet hoevaak elke term voorkomt:
code:
1
2
3
| Term (4) Frequency (2) By (2) |
Bij elke oplossing die ik verzin kom ik dus uit op een kwadratische (of slechtere) methode, maar volgens mijn gevoel moet dit ook sneller kunnen.
Ik gebruik Java hiervoor, dus heb wel een aantal handige Collections tot mijn beschikking, helaas kan een TreeMap bijvoorbeeld niet gebruikt worden omdat deze niet op Values kan sorteren en geen duplicate Keys kan bevatten. Een HashMap kan weer niet sorteren. Zelf een classe maken implements compterator, geeft problemen met het controleren of een term al bestaat, wat betekend dat je een lijst moet bijhouden en door die lijst moet lopen.