Kom ihåg mig?
Home Menu

Menu


Matchning av texter, STORT antal

 
Ämnesverktyg Visningsalternativ
Oläst 2013-05-10, 16:56 #1
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
Standard Matchning av texter, STORT antal

Hej,

Jag har cirka 80 000 texter där det KAN finnas dubletter, inte precis exakt men det skiljer väl sig på något ord/punkt/tecken.

Då jag inte har ork eller tid för att gå igenom 1 och 1 så kanske det finns någon smart teknik som kan leta fram ganska stora likheter i texter? Jag har allting sparat i en databas och i textfiler. Någon som vet vilken teknik jag ska använda?
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-10, 18:15 #2
CotopaXi CotopaXi är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2004
Inlägg: 321
CotopaXi CotopaXi är inte uppkopplad
Flitig postare
 
Reg.datum: Nov 2004
Inlägg: 321
Om du förutsätter att t.ex det första och det sista ordet är samma för dubbletterna borde du kunna få ner 80 000 olika texter till ett betydligt minde antal där det kan finnas dubbletter.

Om det bara skiljer något tecken bör ju dubbletterna också ha ungefär samma längd, du skulle ju kunna kolla hur många som diffar på mindre än 10-tecken i längd. Du skulle också kunna jämföra filstorlek på textfilerna och kolla vilka som diffar mindre än x-bytes i storlek.

Att implementera dessa två borde inte ta lång tid om du behärskar programmering.

Senast redigerad av CotopaXi den 2013-05-10 klockan 18:19
CotopaXi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-10, 18:32 #3
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Jag tycker man kan ta texterna och tokenisera de enskilda orden. sen räknar man hur många ord som är lika och hur många ord det finns totalt.

Sen delar man antalet lika ord med totala antalet ord och får då en procentsiffra som kan ge en hyfsad uppfattning hur lika texterna är.

Sen är det bara att sortera på de med störst likhet och gå in och kika manuellt hur väl det stämmer.

Man kan även göra en ordanalys så man räknar antalet lika tecken i ett enskilt ord för att se om det finns många ord som är snarlika (skiljer 1-2 tecken så kan det vara en felstavning).

Senast redigerad av Conny Westh den 2013-05-10 klockan 18:35
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-10, 18:59 #4
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Har du hittat något eller ska jag slänga ihop ett program?
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-10, 20:10 #5
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
om du vill slänga ihop vore det schysst.

försöker göra ngn sak på det formulär som jag sparar data i som kollar om det redan finns men failar. xD
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-10, 20:39 #6
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
http://www.speedyshare.com/jReHE/DublettFinder.rar

Går efter första/sista ord samt storlek. Inte den mest pålitliga men ska nog ge en bra fingervisning.

Skulle kunna använda LINQ's Except men för mycket data skulle laddas in i minnet, detta verkar fungera hyffsat. Säg gärna till hur det fungerade mot större textfiler.
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-10, 21:31 #7
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
Det funkade bra tyckte jag men nu när jag tänkte efter vill jag ha det som serverkod. jag har gjort ett litet exempel här.

Men problemet är att jag tar hela texter och kopierar in det och då kollar den ju denna kod om hela texten är lika med någon annan. Men jag vill ha detta som Conny beskrev: kolla alla ord som stämmer genom alla ord som finns i strängen man söker med. Hur kan jag trimma denna så det passar?

PHP-kod:
$parts explode(" "trim($_POST["text"]));
        
$likes "";
        
$i 1;
        foreach(
$parts as $part) {
            
$likes .= "`fact` LIKE '%".$database->real_escape_string($part)."%'";
            if(
$i count($parts)) {
                
$likes .= " AND ";
            }
            
$i++;
        }
        if(
strlen($likes) > 0) {
            
$query $database->query("SELECT * FROM facts WHERE ".$likes);
            if(
$query->num_rows 0) {
                echo 
'<table class="table table-striped table-bordered table-condensed">';
                
$arr result_to_array($query);
                foreach(
$arr as $ar) {
                    echo 
'<tr><td>'.$ar["id"].'</td><td>'.$ar["fact"].'</td></tr>';
                }
                echo 
'</table>';
            }
        } 
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-10, 23:32 #8
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Det finns ett flertal olika färdiga funktioner i PHP för att jämföra strängar. Hur bra de fungerar beror helt på vilka behov man har men de kan ju enkelt kombineras med diverse egna kontroller.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-11, 01:12 #9
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Här hittade jag en funktion som splittar upp en textsträng i sql så man får varje ord som en egen rad (MS SQL-Server):

Kod:
Create function dbo.SplitString 
    (
        @str nvarchar(4000), 
        @separator char(1)
    )
    returns table
    AS
    return (
        with tokens(p, a, b) AS (
            select 
                1, 
                1, 
                charindex(@separator, @str)
            union all
            select
                p + 1, 
                b + 1, 
                charindex(@separator, @str, b + 1)
            from tokens
            where b > 0
        )
        select
            p-1 zeroBasedOccurance,
            substring(
                @str, 
                a, 
                case when b > 0 then b-a ELSE 4000 end) 
            AS token
        from tokens
      )
    GO
Så här använder man funktionen för att få fram alla orden:
Kod:
select * 
    from dbo.SplitString('Hello John Smith', ' ')
Så här använder man funktionen för att få fram ett specifikt ord:
Kod:
select * 
    from dbo.SplitString('Hello John Smith', ' ')
    where zeroBasedOccurance=1
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-05-11, 01:36 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Här hittade jag en ännu elegantare lösning:


Kod:
CREATE FUNCTION [dbo].[split](
          @delimited NVARCHAR(MAX),
          @delimiter NVARCHAR(100)
        ) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
        AS
        BEGIN
          DECLARE @xml XML
          SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'

          INSERT INTO @t(val)
          SELECT  r.value('.','varchar(MAX)') as item
          FROM  @xml.nodes('/t') as records(r)
          RETURN
        END

För att testa:
Kod:
select * From split('Hello**John**Smith','**')
select * From split('Hello*-*John*-*Smith','*-*')
select * from split('Hello John Smith',' ')
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 09:37.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017