2016-04-25 8 views
0

Ich bin auf der Suche nach einem Weg durch einen Satz gehen, um zu sehen, ob ein Apostroph ein Zitat oder eine Kontraktion ist, so kann ich Satzzeichen aus der Zeichenfolge entfernen und normalisieren dann alle Wörter.herauszufinden, ob ein Apostroph ist ein Zitat oder eine Kontraktion

Mein Test Satz ist: don't frazzel the horses. 'she said wow'.

In meiner Versuche, die ich den Satz in Worte Teile geteilt haben tokonizing auf Worte und nicht Worte wie so:

contractionEndings = ["d", "l", "ll", "m", "re", "s", "t", "ve"] 

sentence = "don't frazzel the horses. 'she said wow'.".split(/(\w+)|(\W+)/i).reject! { |word| word.empty? } 

Das gibt ["don", "'", "t", " ", "frazzel", " ", "the", " ", "horses", ". '", "she", " ", "said", " ", "wow", "'."]

Next I möchte in der Lage sein, Satz nach Apostrophen ' zu iterieren und wenn man gefunden wird, vergleichen Sie das nächste Element, um zu sehen, ob es im contractionEndings Array enthalten ist. Wenn es enthalten ist, möchte ich das Präfix, den Apostroph ', und das Suffix in einem Index, sonst die Apostrophe entfernen.

In diesem Beispiel don, ' und t würden in don't als einzigen Index verbunden werden, aber . ' und '. entfernt werden würde.

Danach kann ich eine Regex ausführen, um andere Satzzeichen aus dem Satz zu entfernen, so dass ich es in meine Stemmer übergeben kann, um die Eingabe zu normalisieren.

Die endgültige Ausgabe, nach der ich bin, ist don't frazzel the horses she said wow, in der alle Interpunktionszeichen neben Apostrophen für Kontraktionen entfernt werden.

Wenn jemand irgendwelche Vorschläge hat, um diese Arbeit zu machen oder eine bessere Idee zu haben, wie man dieses Problem löst, würde ich gerne wissen.

Insgesamt möchte ich alle Interpunktion aus dem Satz mit Ausnahme von Kontraktionen entfernen.

Danke

+0

, was zur Folge haben Sie erwarten, endlich – Ilya

+0

? @Ilya 'Sie die Pferde nicht frazzel sie sagte wow' –

+2

Warum die Eile, eine Antwort zu wählen? Warum nicht mindestens unt warten Haben diejenigen, die an Antworten gearbeitet haben, eine Chance zu posten? –

Antwort

1

Wie ich in einem Kommentar erwähnt habe, denke ich, versuchen alle möglichen Kontraktionsendungen aufzulisten ist fruchtlos. Tatsächlich enthalten einige Kontraktionen, wie "könnte nicht", mehr als ein Apostroph.

Die andere Möglichkeit besteht darin, einfache Anführungszeichen zu verwenden. Mein erster Gedanke war, das Zeichen "'" zu entfernen, wenn es am Anfang des Satzes oder nach einem Leerzeichen steht, oder wenn ihm ein Leerzeichen folgt oder am Ende eines Satzes steht. Leider wird dieser Ansatz durch Possessivwörter, die in einem "s" enden, frustriert: "Chris 'Katze hat Flöhe".Schlimmer noch, wie sollen wir "Wo sind Chris 'Autos?" oder "Die Nacht vor Weihnachten".

Hier ist eine Möglichkeit, einfache Anführungszeichen zu entfernen, wenn es keine Apostrophe am Anfang oder Ende von Wörtern gibt (was zugegebenermaßen von fraglichem Wert ist).

r =/
    (?<=\A|\s) # match the beginning of the string or a whitespace char in a 
       # positive lookbehind 
    \'   # match a single quote 
    |   # or 
    \'   # match a single quote 
    (?=\s|\z) # match a whitespace char or the end of the string in a 
       # positive lookahead 
    /x   # free-spacing regex definition mode 

"don't frazzel the horses. 'she said wow'".gsub(r,'') 
    #=> "don't frazzel the horses. she said wow" 

Ich denke, die beste Lösung für die Sprache verschiedene Symbole für Apostrophe und einfache Anführungszeichen zu verwenden, ist Englisch.

0

Normalerweise bleibt das Apostroph bei der Kontraktion nach der Tokenzierung.

Versuchen Sie einen normalen NLP-Tokenizer, z. in Python nltk:

>>> from nltk import word_tokenize 
>>> word_tokenize("don't frazzel the horses") 
['do', "n't", 'frazzel', 'the', 'horses'] 

Für mehrere Sätze:

>>> from string import punctuation 
>>> from nltk import sent_tokenize, word_tokenize 
>>> text = "don't frazzel the horses. 'she said wow'." 
>>> sents = sent_tokenize(text) 
>>> sents 
["don't frazzel the horses.", "'she said wow'."] 
>>> [word for word in word_tokenize(sents[0]) if word not in punctuation] 
['do', "n't", 'frazzel', 'the', 'horses'] 
>>> [word for word in word_tokenize(sents[1]) if word not in punctuation] 
["'she", 'said', 'wow'] 

Abflachen der Sätze vor word_tokenize:

>>> from itertools import chain 
>>> sents 
["don't frazzel the horses.", "'she said wow'."] 
>>> [word_tokenize(sent) for sent in sents] 
[['do', "n't", 'frazzel', 'the', 'horses', '.'], ["'she", 'said', 'wow', "'", '.']] 
>>> list(chain(*[word_tokenize(sent) for sent in sents])) 
['do', "n't", 'frazzel', 'the', 'horses', '.', "'she", 'said', 'wow', "'", '.'] 
>>> [word for word in list(chain(*[word_tokenize(sent) for sent in sents])) if word not in punctuation] 
['do', "n't", 'frazzel', 'the', 'horses', "'she", 'said', 'wow'] 

Beachten Sie, dass das Apostroph mit dem 'she bleibt. Leider einfache Aufgabe tokenization hat immer noch seine Schwäche inmitten all dem Hype auf anspruchsvolle (tief) Methoden des maschinellen Lernens heute = (

Es Fehler auch mit formalen Grammatik Text macht:

>>> text = "Don't frazzel the horses. 'She said wow'." 
>>> sents = sent_tokenize(text) 
>>> sents 
["Don't frazzel the horses.", "'She said wow'."] 
>>> [word_tokenize(sent) for sent in sents] 
[['Do', "n't", 'frazzel', 'the', 'horses', '.'], ["'She", 'said', 'wow', "'", '.']] 
1

Sie die Pragmatic Tokenizer gem verwenden könnte . Es kann English contractions erkennen.

s = "don't frazzel the horses. 'she said wow'." 
PragmaticTokenizer::Tokenizer.new(punctuation: :none).tokenize(s) 
=> ["don't", "frazzel", "the", "horses", "she", "said", "wow"] 

s = "'Twas the 'night before Christmas'." 
PragmaticTokenizer::Tokenizer.new(punctuation: :none).tokenize(s) 
=> ["'twas", "the", "night", "before", "christmas"] 

s = "He couldn’t’ve been right." 
PragmaticTokenizer::Tokenizer.new(punctuation: :none).tokenize(s) 
=> ["he", "couldn’t’ve", "been", "right"] 
+0

PS - Pragmatic Tokenizer hat auch eine Option [Erweiterungen erweitern] (https://github.com/diasks2/pragmatic_tokenizer#expand_contractions). – diasks2