2016-08-08 30 views
-1

Erstens habe ich darüber recherchiert und gefunden, die eng mit Wortgrenzen in einem Satz oder maximal beschäftigen, schlagen die Verwendung von Tokenizern, die nicht das ist, was ich suche. Meine Frage lautet wie folgt:Wie man Wortgrenzen in Rohtext dynamisch vorgibt, während ein Dokument vorverarbeitet wird?

Meine aktuelle Aufgabe Vorverarbeitung einer unstrukturierten Daten bezieht, die diese Pipeline folgen - Konvertierung von PDF zu TXT-Dateien, die wie folgt paar Sätze gibt aus:

se ar chthisstr ing für ein def ect

, was ich will eigentlich ist:

Suche diese Zeichenfolge für einen Defekt

Alles, was ich suche, sind einige mögliche Ansätze für solche Arten von Szenarien in NLP. Vielen Dank im Voraus!

+0

Sie suchen nach einem Tokenizer, auch wenn Sie nicht glauben, dass Sie nach einem Tokenizer suchen. Wenn der Inhalt, den Sie aus dem PDF-Dokument ziehen, einheitlich ein Zeichentrennzeichen verwendet, das nicht mit dem Worttrennzeichen identisch ist, können Sie das ersetzen/entfernen. –

+0

Extrahieren Sie manuell Text aus den PDF-Dateien? Das ist schmerzhaft. Verwenden Sie eine [Bibliothek] (https://pypi.python.org/pypi?%3Aaction=search&term=pdf&submit=search), um die Extraktion durchzuführen. –

+0

Dies gehört wahrscheinlich auf program- ming.stackexchange.com und nur mit einem nlp-Tag. –

Antwort

0

Verwenden Sie this file für die Wortliste.

from math import log 

# Build a cost dictionary, assuming Zipf's law and cost = -math.log(probability). 
words = open("words-by-frequency.txt").read().split() 
wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words)) 
maxword = max(len(x) for x in words) 

def infer_spaces(s): 
    """Uses dynamic programming to infer the location of spaces in a string 
    without spaces.""" 

    # Find the best match for the i first characters, assuming cost has 
    # been built for the i-1 first characters. 
    # Returns a pair (match_cost, match_length). 
    def best_match(i): 
     candidates = enumerate(reversed(cost[max(0, i-maxword):i])) 
     return min((c + wordcost.get(s[i-k-1:i], 9e999), k+1) for k,c in candidates) 

    # Build the cost array. 
    cost = [0] 
    for i in range(1,len(s)+1): 
     c,k = best_match(i) 
     cost.append(c) 

    # Backtrack to recover the minimal-cost string. 
    out = [] 
    i = len(s) 
    while i>0: 
     c,k = best_match(i) 
     assert c == cost[i] 
     out.append(s[i-k:i]) 
     i -= k 

    return " ".join(reversed(out)) 

s = 's e ar c h t h i s s t r ing for a def e c t'.replace(' ','') 
print(infer_spaces(s))