Dies ist die Aufzeichnung der 81. "Gegenmaßnahmen bestehend aus zusammengesetzten Wörtern" in Language Processing 100 Knock 2015. Auch dieses Mal wird nach der vorherigen Corpus-Formgebung das Vorverarbeitungssystem verwendet, und die Hauptverarbeitung ist das Ersetzen von Zeichen mithilfe regulärer Ausdrücke. Ich mache jedoch die mühsame Arbeit manuell in dem Teil der Erstellung der Ländernamenliste. Aus diesem Grund ist die Programmierung selbst nicht schwierig, aber es hat einige Zeit gedauert.
Verknüpfung | Bemerkungen |
---|---|
081.Umgang mit Ländernamen, die aus zusammengesetzten Wörtern bestehen.ipynb | Antwortprogramm GitHub Link |
100 Klicks Amateur-Sprachverarbeitung:81 | Ich bin Ihnen immer zu Dank verpflichtet, wenn ich auf 100 Sprachverarbeitung klopfe |
100 Sprachverarbeitung klopfen 2015 Version(80~82) | Kapitel 9 war hilfreich |
Art | Ausführung | Inhalt |
---|---|---|
OS | Ubuntu18.04.01 LTS | Es läuft virtuell |
pyenv | 1.2.15 | Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze |
Python | 3.6.9 | python3 auf pyenv.6.Ich benutze 9 3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden Pakete werden mit venv verwaltet |
enwiki-20150112-400-r10-105752.txt.bz2 Ist der Text von 105.752 Artikeln zufällig 1/10 aus den Artikeln ausgewählt, die zum 12. Januar 2015 aus etwa 400 Wörtern oder mehr der englischen Wikipedia-Artikel bestehen und im bzip2-Format komprimiert sind. Gibt es. Mit diesem Text als Korpus möchte ich einen Vektor (verteilten Ausdruck) lernen, der die Bedeutung eines Wortes ausdrückt. In der ersten Hälfte von Kapitel 9 wird der Prozess des Lernens des Wortvektors implementiert, indem er in mehrere Prozesse unterteilt wird, indem die Hauptkomponentenanalyse auf die aus dem Korpus erstellte Matrix für das gleichzeitige Auftreten von Wortkontexten angewendet wird. In der zweiten Hälfte von Kapitel 9 wird der durch Lernen erhaltene Wortvektor (300 Dimensionen) verwendet, um die Ähnlichkeit von Wörtern zu berechnen und zu analysieren (analog).
Beachten Sie, dass bei gehorsamer Implementierung von Problem 83 eine große Menge (ca. 7 GB) Hauptspeicher erforderlich ist. Wenn Ihnen der Speicher ausgeht, erstellen Sie einen Prozess oder ein 1/100 Stichproben-Korpus enwiki-20150112-400-r100-10576.txt.bz2. Verwenden Sie /nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2).
Diesmal * 1/100 Stichprobenkorpus enwiki-20150112-400-r100-10576.txt.bz2 400-r100-10576.txt.bz2) ”* wird verwendet.
Im Englischen kann die Verkettung mehrerer Wörter sinnvoll sein. Zum Beispiel werden die Vereinigten Staaten als "Vereinigte Staaten" und das Vereinigte Königreich als "Vereinigtes Königreich" ausgedrückt, aber die Wörter "Vereinigte Staaten", "Staaten" und "Königreich" allein sind nicht eindeutig. Daher möchten wir die Bedeutung des zusammengesetzten Wortes schätzen, indem wir das im Korpus enthaltene zusammengesetzte Wort erkennen und das zusammengesetzte Wort als ein Wort behandeln. Es ist jedoch sehr schwierig, zusammengesetzte Wörter genau zu identifizieren. Daher möchten wir hier einen Ländernamen identifizieren, der aus zusammengesetzten Wörtern besteht.
Holen Sie sich Ihre eigene Liste von Ländernamen im Internet und ersetzen Sie die Leerzeichen durch Unterstriche für die Ländernamen der zusammengesetzten Wörter, die in den 80 Korpora erscheinen. Beispielsweise sollte "USA" "United_States" und "Isle of Man" "Isle_of_Man" sein.
Es ist mühsam, "die Ländernamenliste selbst aus dem Internet zu beziehen" ...
Ich dachte, dass die Seite "Ländercodes / Namen" gut wäre, aber die "Isle of" in der Problemstellung Es gibt keinen Mann ". "Isle of Man" scheint in ISO 3166-1 zu sein, also [Wikipedia ISO 3166-1] Ich habe die Liste von (https://en.wikipedia.org/wiki/ISO_3166-1) erhalten. Mit anderen Worten, wir erstellen eine Ländernamenliste aus den folgenden drei.
[" Ländercodes / Namen "](http://www.fao.org/countryprofiles/iso3list/en/) Kurzname
SpalteEinige Namen, die aus der Spalte "Offizieller Name" von "Ländercodes / Namen" stammen, werden mit dem Präfix "the" versehen. Ich habe es später entfernt, weil es ein Hindernis war.
Da ich es von drei bekommen habe, sind einige Ländernamen dupliziert, also habe ich die Duplikate gelöscht.
Das Thema lautet diesmal "Ländername bestehend aus zusammengesetzten Wörtern", und ein Ländername mit einem einzigen Wort ist nicht erforderlich. Ich habe = COUNTIF (A1," * * ")
auf EXCEL ausgeführt und den Ländernamen mit einem Leerzeichen dazwischen als zusammengesetztes Wort beurteilt und den Ländernamen entfernt, dessen EXCEL-Funktionsergebnis 0 war.
Einige von ihnen können nicht so verwendet werden, wie sie sind, daher habe ich Feineinstellungen manuell vorgenommen. Es braucht Zeit ... Das Folgende ist ein Beispiel.
Ehemalige | Nach der veränderung |
---|---|
Bolivia (Plurinational State of) | Plurinational State of Bolivia |
Cocos (Keeling) Islands | Cocos Keeling Islands Cocos Keeling Cocos Islands Keeling Islands |
Am Ende wurden 247 Ländernamen erstellt.
Es ist ein Programm. Der Prozess ist kurz und trivial (ich verbringe ein paar Stunden damit, ihn zu machen, weil ich keine Fähigkeiten habe ...).
Es dauert jedoch ungefähr 12 Minuten, um eine Volltextsuche durchzuführen und bis zu 247 Ländernamen zu ersetzen. Artikel "100 Klopfen Sprachverarbeitung 2015 Version (80-82)" Es ist schneller, wenn Sie den Befehl sed
verwenden Oder nicht?
import re
#Entfernen Sie den Zeilenvorschubcode aus der Datei und stellen Sie die Wortnummer zum Sortieren voran
with open('./081.countries.txt') as countires:
country_num = [[len(country.split()), country.rstrip('\n')] for country in countires]
country_num.sort(reverse=True)
with open('./080.corpus.txt') as file_in:
body = file_in.read()
for i, country in enumerate(country_num):
print(i, country[1])
regex = re.compile(country[1], re.IGNORECASE)
body = regex.sub(country[1].replace(' ', '_'), body)
with open('./081.corpus.txt', mode='w') as file_out:
file_out.write(body)
Die Liste der Ländernamen wird gelesen, die Anzahl der Wörter wird zur Liste hinzugefügt und in absteigender Reihenfolge sortiert. Dies liegt daran, dass "Vereinigte Staaten von Amerika" durch "Vereinigte Staaten" ersetzt wird, die eine geringere Anzahl von Wörtern enthält, und nicht durch "Vereinigte Staaten von Amerika".
#Entfernen Sie den Zeilenvorschubcode aus der Datei und stellen Sie die Wortnummer zum Sortieren voran
with open('./081.countries.txt') as countires:
country_num = [[len(country.split()), country.rstrip('\n')] for country in countires]
country_num.sort(reverse=True)
Durch Setzen von "re.INGNORECASE" im regulären Ausdruck wird es ersetzt, ohne zwischen Groß- und Kleinschreibung zu unterscheiden (ich habe nicht bestätigt, ob diese Schwankung nützlich ist).
regex = re.compile(country[1], re.IGNORECASE)