Szóstatisztika

Fórumok

Üdv!

Van egy adott .odt doksim (de lehetne akar .txt is, mert csak sima szöveg alapvető formázással). Arról szeretnék szóstatisztikát készíteni, magyarul, hogy a szavak milyen gyakran fordulnak elő.

Egy olyan programra lenne szükségem, ami ezt meg tudná csinálni helyettem. Tehát számolja össze, és a végén valamilyen kimeneti fájlba listázza ki nekem, lehetőleg csökkenő/növekvő sorrendben, hogy az adott szavak milyen gyakorisággal fordulnak elő.

Mindenképpen jó lenne, ha nem tenne különbséget a kis- és nagybetűs írás között, esetleg ha valami alapszinten felismerné a ragokat, toldalékokat, az se lenne rossz, de az nem lényeges.

Előre is köszönöm a segítséget.

Ja, lehetőleg Linux alatti megoldások érdekelnek (hogy külön program, parancssoros cucc vagy OpenOffice plugin az lényegtelen), de ha Windows alatti megoldást javasoltok, az se rossz.

Hozzászólások

Sima szövegre szűrő:

tr -s " " "\n"|sort|uniq -ci|sort -nr

Engem is érdekelne ilyen progi akár milyen formában

már a megvalosítási ötletek is jók de nem tudom hol induljak el

köszi

Ez nem jó? Lecserélem a szóközöket újsorra, rendezem, a uniq paranccsal kiszűröm az ismétlődő sorokat (szavakat) és a sorok elé íratom az előfordulások számát, majd rendezem az előfordulások száma szerint.

Az odt néhány XML fájl zip-elve, a content.xml-ből sed-del el lehet távolítani a tag-eket.

Igen, terminálban. Pontosabban: ez egy "szövegszűró", azaz ha kiadod ezt a parancsot, a bemenetére küldött szöveg szavait vizsgálja, és a kimenetre írja a statisztikát.

Ha nem ismernéd: ha két parancs közé | jelet írunk, az első parancs kimenete lesz a második parancs bemenete. Az általam írt sorban mind a 4 parancs úgy működik, hogy a bemenetére küldött szöveget átalakítja, és a kimenetre küldi. Tehát az első parancs bemenetére küldött szöveg átmegy a 4 szűrőn, és a negyedik parancs kimenete lesz a végső kimenet, a statisztika. Ha egy fájlból akarsz statisztikát csinálni, az első parancs bemenetét olvastasd egy fájlból, azaz az első parancs után (az első | elé) írd ezt: <fájlnév . Ha a statisztikát fájlba akarod íratni, akkor az utolsó parancs kimenetét irányítsd egy fájlba, azaz az utolsó parancs után írd ezt: >fájlnév .

Nem. Azt, hogy egy parancs bemenete vagy kimenete a terminál helyett egy fájl legyen, mindig a parancs után kell megadni, tehát ahhoz, hogy az első parancs (az első | előtti parancs) bemenete az arany.txt legyen, ez kell:

tr -s " " "\n"<arany.txt|sort|uniq -ci|sort -nr>kimenet.txt

Amúgy: amíg nem válaszoltak a hozzászólásodra, tudod szerkeszteni, ha alatta a Szerkesztés linkre kattintasz. Nem kellett volna mindig új hozzászólást küldeni.

nagyon király vagy gd!!a parancsodat hogy lehetne úgy kiegészíteni hogy a szavak számát is kiirja

ilyen alapon akkor egy adott doksira van betűstatisztika nem?ahol megszámolja adottt betűkből és írásjelekből mennyi van?

van ilyen?

köszi

szia én ezt beírtam de nem ment

sed 's/\(.\)/\1\n/g'< arany.txt |sort|uniq -ci|sort -nr> kimenet.txt

mi a gond ezzel?

Az eredeti felvetésben említve volt a ragozás. A ragozás figyelembe vétele már jó ideje megvalósítható szabad szoftveres eszközökkel, konkrétan a Hunspell csomag hunstem programjával és a morfológiai információkkal kiegészített magyar szótárral.

Pl.


$ echo "A kutya szereti a macskát. A macskák szeretik a kutyákat." | ./hunstem ./hu_HU_morph.{aff,dic} /dev/stdin | grep -v "&gt" | sort | uniq -c

      4 a
      2 kutya
      2 macska
      2 szeret

Szia!

ezeket az oldalakat jócskán átnéztem már de nem sikerült semmi jót összehozni eddig !

a hunspellt feltettem (apt-vel)

jó lenne egy kis segítség mert már nagyon megszenvedek ezzel

(én egy szövegben lévő szavakat szeretnék szótövesíteni)

Szted hogy csináljam vagy mit tegyek még fel!

Nagyon örülnék egy kis segítségnek

köszi

1. kérdés: van "hunstem" binárisod? Ha nincs, fordíts forrásból (hunspell része)
2. kérdés: van morfológiai információval ellátott szótárad? Ha nincs, készíts forrásból (magyarispell része)

Ezeket a dolgokat nem fogod tudni csomagból feltenni, mert nincsenek becsomagolva, vagy ha be vannak, akkor is egyszerűbb gyorsan fordítani egyet, mint keresgélni. Ha próbáltál fordítani, és nem ment, akkor írd le, hogy mi nem ment.

Szia!valahogy próbáld így fórumon keresztül elmondani mert nagyon kezdő linuxos vagyok nem olyan régóta tolom. ezeket a forrásos dolgokat nem értem(hunsteam,ispell)

az elejétől kellene segítség

hogy mit szedjek le hogy mit telepítsek(fordítsak)

vhogy nem tudjuk felvenni a kapcsolatot?

köszönöm a segítséget

Visszavonom tanaimat. Először is, a legújabb hunspell-ben nincs is hunstem. Másodszor is nem igazodok ki a jelenlegi helyzeten, és a dokumentáció sem segít.

Pl. man-ban:

hunspell -r *.html
Az aktuális könyvtárban található összes HTML állomány szavainak és a szavak szótöveinek kiírása.

Igen ám, de -r kapcsoló valójában nincs. További nyomozás szükséges, hogy a probléma hogyan oldható meg.

A dokumentációt most frissítem. A hunstem funkciók az analyze programba kerültek, de a napokban várható kiadásban a parancssori hunspell -s kapcsolójával (ami egyben szavakra is tördel, tehát egyből szövegfájlokon futtatható) is elérhető lesz.
A magyar tövezést sajnos még javítani kell, elsősorban azért, mert a képzett alakoknál nagyon lelassul a tövezés (toldalékolást is használ itt a program, ami a nem optimalizált szótárral még meggátolja, hogy nagy mennyiségű szöveg indexelésére lehessen használni).

Mikorra várható hogy tudom használni a tövezést kár lassan akár optimalizálva?
Nekem csak egy viszonylagos eredmény kell!
Ha lesz bármiféle info erről a dologról írj már nekem ide vagy egy emailt.
köszi
ja és a dokumentációt honnan érem el és mit töltsek le hogy majd menjen?
sapi87 kukac citromail pont hu

Magad uram, ha szolgád nincsen: http://pastebin.com/VMUNr56Z

Ez a regex-gyűjtemény szolgált 4-5 éve egy tízezer egyedi tételt tartalmazó név- és címmutató toldalékainak leválasztására. (Persze nem teljes, de nálam csak ezek fordultak elő, és nem is hibátlan, azért javítgatnom kellett egy-két tételt utólag :)

A dokumentáció jól fog jönni, mert nem úgy működik, mint régen.

timar@jars-desktop:~/magyarispell-1.3$ analyze hu_HU_morph.aff hu_HU_morph.dic /dev/stdin
majom
> majom
analyze(majom) = st:majom [noun]{+[NOM]}
stem(majom) = majom
majmot
> majmot
Unknown word.
majomot
> majomot
Unknown word.
kutya
> kutya
analyze(kutya) = st:kutya [noun]{+[NOM]}
stem(kutya) = kutya
kutyát
> kutyát
Unknown word.
cica
> cica
analyze(cica) = st:cica [noun]{+[NOM]}
stem(cica) = cica
cicát
> cicát
Unknown word.
megyek
> megyek
Unknown word.
megy
> megy
Unknown word.

A kettővel fenti példám azért nem ment, mert elrontottam a szótárkészítést. Tehát elvileg minden jó már most is.

A te fő problémád, sapi, ha jól látom, az, hogy az "ilyen forrásos dolgokat nem érted". Ezen nehéz lesz segíteni egy rövid hozzászólásban, meg kell tanulnod valahonnan, ha terveid vannak a szabad szoftverekkel.

Általában annyira egyszerű, hogy a forráscsomagot le kell tölteni, ki kell csomagolni, majd a ./configure && make && sudo make install parancsot kiadni. A kicsomagolt forrás gyökerében szokott lenni readme, azt el lehet olvasni.

A magyarispell csomagot egyszerűen úgy kell "lefordítani" hogy 'make'.

Te valamire vársz most? Mondjuk a Hunspell 1.2.2 kiadására? Ez szerintem nem szükséges, mert a feladatodat az 1.2.2 bétával vagy egy régebbi kiadással is megoldhatod. Laci leírta, hogy a 'hunstem' átneveződött 'analyze'-ra, vagy egyik, vagy másik meglesz. Utána meg a fórumban feljebb gördítve megnézed, hogy hogy kell használni, leírtam már. Ha odáig eljutsz, hogy elkészíted a tövező programot és a szótárat, és parancssorban működik, akkor jelezd, és továbbléphetünk, hogy hogyan dolgozd fel a kimenetét céljaidnak megfelelően.

"Ha odáig eljutsz, hogy elkészíted a tövező programot és a szótárat, és parancssorban működik, akkor jelezd, és továbbléphetünk, hogy hogyan dolgozd fel a kimenetét céljaidnak megfelelően."

Na ezt nem értem!

Tehát letöltöm a csomagokat és ezzel kell megcsinálni ./configure && make && sudo make install

ez ok a következő kérdés
Mit kell letölteni és forrásból feltenni?

kicsit értetlen vagyok mert egy két dolog nem tiszta:-)

köszi a kitartó válaszokat :-)

így csomagolod ki őket:
tar xzf fájlneve
minden ilyesmi parancsot terminálba vagy konzolba írj be. TAB billentyűvel kiegészíthetsz. Ha nem egyértelmű, nyomd meg kétszer.
ha alap dolgokkal sem vagy tisztában, nézz körbe pl. itt: http://szabilinux.hu/ - bár kissé elavult, még mindig sokat tanulhatsz belőle.

na kész van feltettem a hunspell -t (kicsomagoltam majd ./configure && make && sudo make install - lal)
aztán ispell kicsomagolás és make és a végén ezt kaptam

===> ragozási táblázat (magyar.aff) előállítása
/bin/sh: m4: not found
make: *** [magyar.aff] Error 127

eddig kész várom az instrukciókat

ez mit jelent!

hogy kell parancssorbol megnézni hogy mükődik e?

eddig kész várom az instrukciókat

mit csináljak most???

köszi a kitartást

lefutattam egy txt(utf-8) re és ezt kaptam ez egy részlet

generate(társal­kodónője,, a tiszt korábbi kedvese és annak az anyja között, kiket ő mind személye) = NO DATA
generate(en, ismert. Ez volt az alapeszme, a végkatasztrófa, amihez aztán nekem a megelőző történetet) = NO DATA
generate(, mely e végzethez elvezet, hozzá kellett építenem, s a szereplő alakokat, helyzeteket mind ö) = NO DATA
generate(sze­válogatnom:, hihetővé tennem. De azok az alakok és helyzetek mind megvoltak valósággal.) = NO DATA
generate(A, “Senki szigetének” a létezéséről pedig Frivaldszky Imre nagynevű természettudósunk �) = NO DATA
generate(ltal, értesültem, s az a hatvanas években még a maga kivételes állapotában megvolt, mint egy) = NO DATA
generate(se, Magyar-, se Törökországhoz nem tartozó új alkotású terület.) = NO DATA
generate(Ennyit, jónak láttam elmondani.) = NO DATA
generate(Dr., Jókai Mór) = NO DATA

mit rontottam el ??

nekem ilyesmi erdemény kellene:

http://hup.hu/node/46561#comment-515732

Ejnye, megint rossz tanácsot adtam, mert a hunstem nagyon berögzült az agyamba. Az analyse úgy működik, hogy ha egy sorban 2 szó van, akkor az elsőt a másodiknak megfelelően próbálja ragozni. Ez nem sikerülhetett.

Szóval mondjuk azt lehetne csinálni, hogy a szöveget szavakra bontani előbb.

$ cat valamit.txt | tr -d '.,:;!?' | tr ' ' '\n' | analyze hu_HU_u8_morph.aff hu_HU_u8_morph.dic /dev/stdin

És akkor ennek a kimenetét szűrni igény szerint. Mondjuk

$ cat valamit.txt | tr -d '.,:;!?' | tr ' ' '\n' | analyze hu_HU_u8_morph.aff hu_HU_u8_morph.dic /dev/stdin | grep analyze | sed -e "s/^.*st://" -e "s/ .*//" | sort | uniq -c

Én ilyeneket szoktam gányolni magamnak, biztos lehetne szebben is...

feltettem a hunspell új kiadását de mondjuk hunspell -s arany.txt-re ezt kapo:
Nem lehet megnyitni a ragozási vagy a szótárfájlt.

Pontosan mit tegyek fel és hogyan és milyen paranccsal tudok egy txt-t letövezni!!

köszi a választ

A szótár elérési útja micsoda alap esetben mert ezt nem tudom?,

köszi

amit eddig csináltam:

(letölt hunspell
letölt magyarispell
kicsomagolom őket
majd ahunspell ./configure && make && sudo make install
apt-get install m4
majd magyarispell make
ennyit csináltam semmit nem állítgattam)

Akkor ott van a szótár, ahol elkészítetted, a kicsomagolt magyarispell könyvtárban. Annak az elérési útját kell megadni. Ha átmásolod az /usr/share/hunspell könyvtárba (amit valószínűleg előbb létre kell hozni), akkor nem kell a -d után elérési utat írnod, csak a szótár nevét. Ha itt a szótárt átnevezed default.dic-re és default.aff-ra, akkor -d kapcsoló sem kell.

úgy néz ki megy adolog de lehet h még lesznek gondok!:-)
példa: hunspell -d /home/sapi/magyarispell-1.3/hu_HU_u8 -s

+ Törökország
*
+ tartozik
*
+ alkot
*

+ ennyi
+ jón
*
+ mond

de ez jó eredmény mert a tartozik szó sz nem szótő!? ez szerintem nem szótövesített!?

de megkérdezem hogy a meglehet e valahogy számoltatni hogy melyik szótöből mennyi van és ezt sorba rendezni és egy txt-be tenni

köszi a választ

A "tartozik" szónak szerinted mi a töve? Szerintem ezt speciel jól csinálta.

Természetesen meg lehet számolni és txt-be is ki lehet tenni.

grep, sed, sort, uniq

ezekre lesz szükséged. Pl. ha a kimenet olyan jellegű, mint amilyet írtál fent, akkor a parancs után illeszd be:

| grep "+" | sed -e "s/^.* //" | sort | uniq -c >kimenet.txt

igazad van rossz példát hoztam de a txt-ben ez is van: 5 zsibbad 2 zsibbadt ezeknek a szótöve a zsibbad nem?
akkor ez most jó eredmény?

ja meg nem rendezte előfordulás szerint sorba melyik paraméter írjam át?nekem ilyen eredmény kell: http://hup.hu/node/46561#comment-515732 ami te írtál!!:-)

köszi a választ

5 zsibbad 2 zsibbadt: hát ehhez nem tudok hozzászólni, lévén más szófajú a két szó, nem tudom hogy vannak a szótárban stb. Nem biztos, hogy egy igéből generálódik minden képzett forma, lehet, hogy külön is fel van véve.

Amit én írtam, ott véletlenül úgy jött ki, hogy az 'a'-ból volt a legtöbb. A számosság szerinti rendezéshez a uniq -c után írd be:
| sort -gr

De nem is értem, miért nem tudod ezeket kiolvasni a man-ból?! Én is onnan nézem, a fene sem tudja fejből.

Szia!

Nagyjából megismertem a program mükődését de arra nem tudok rájönni hogy az "a" mért nem hozza ki eredményként!
valahogy nem lehetne eredményként azt is számon tartani?

köszi a választ