Ich verwende str.contains für die Textanalyse in Pandas. Wenn für den Satz "Mein letzter Datenjob ein Analyst" war, möchte ich eine Kombination der Wörter "Daten" & "Analyst", aber gleichzeitig möchte ich die Anzahl der Wörter zwischen den beiden für die Kombination verwendeten Wörtern angeben (hier sind es 2 Wörter zwischen "Data" und "Analyst" .Zum Moment verwende ich (DataFile.XXX.str.contains ('job') & DataFile.XXX.str.contains ('Analyst') um die Zählungen für " Job Analyst“. Wie kann ich die Anzahl der Worte zwischen den zwei Worten in der str.contains Syntax angeben. Vielen Dank im VorausPython Textverarbeitung (str.contains)
Antwort
Sie können nicht. Zumindest dest~~POS=HEADCOMP nicht in einer einfachen oder standardisierten Art und Weise.
Selbst die Grundlagen, wie Sie ein "Wort" definieren, sind Los komplexer als Sie sich wahrscheinlich vorstellen. Wortparsing und lexikalische Nähe (z. B. "sind zwei Wörter innerhalb des Abstands D zueinander in Satz s?") Ist der Bereich von natural language processing (NLP). NLP- und Proximity-Suchen gehören nicht zu den grundlegenden Pandas und auch nicht zu Pythons Standard-String-Verarbeitung. Sie könnten etwas wie NLTK, the Natural Language Toolkit importieren, um dieses Problem in einer allgemeinen Weise zu lösen, aber das ist eine ganze andere Geschichte.
Lassen Sie uns einen einfachen Ansatz betrachten. Zuerst benötigen Sie eine Möglichkeit, eine Zeichenfolge in Wörter zu analysieren. Im Folgenden ist rau von NLP-Standards, wird aber für einfachere Fälle arbeiten:
def parse_words(s):
"""
Simple parser to grab English words from string.
CAUTION: A simplistic solution to a hard problem.
Many possibly-important edge- and corner-cases
not handled. Just one example: Hyphenated words.
"""
return re.findall(r"\w+(?:'[st])?", s, re.I)
ZB:
>>> parse_words("and don't think this day's last moment won't come ")
['and', "don't", 'think', 'this', "day's", 'last', 'moment', "won't", 'come']
Dann brauchen Sie einen Weg, um alle Indizes in einer Liste zu finden, wo ein Zielwort gefunden:
def list_indices(target, seq):
"""
Return all indices in seq at which the target is found.
"""
indices = []
cursor = 0
while True:
try:
index = seq.index(target, cursor)
except ValueError:
return indices
else:
indices.append(index)
cursor = index + 1
Und schließlich ein Entscheidungs Wrapper:
Sodef words_within(target_words, s, max_distance, case_insensitive=True):
"""
Determine if the two target words are within max_distance positiones of one
another in the string s.
"""
if len(target_words) != 2:
raise ValueError('must provide 2 target words')
# fold case for case insensitivity
if case_insensitive:
s = s.casefold()
target_words = [tw.casefold() for tw in target_words]
# for Python 2, replace `casefold` with `lower`
# parse words and establish their logical positions in the string
words = parse_words(s)
target_indices = [list_indices(t, words) for t in target_words]
# words not present
if not target_indices[0] or not target_indices[1]:
return False
# compute all combinations of distance for the two words
# (there may be more than one occurance of a word in s)
actual_distances = [i2 - i1 for i2 in target_indices[1] for i1 in target_indices[0]]
# answer whether the minimum observed distance is <= our specified threshold
return min(actual_distances) <= max_distance
dann:
>>> s = "and don't think this day's last moment won't come at last"
>>> words_within(["THIS", 'last'], s, 2)
True
>>> words_within(["think", 'moment'], s, 2)
False
Das einzige, was ist noch zu tun Karte, die zurück zu Pandas:
df = pd.DataFrame({'desc': [
'My latest Data job was an Analyst',
'some day my prince will come',
'Oh, somewhere over the rainbow bluebirds fly',
"Won't you share a common disaster?",
'job! rainbow! analyst.'
]})
df['ja2'] = df.desc.apply(lambda x: words_within(["job", 'analyst'], x, 2))
df['ja3'] = df.desc.apply(lambda x: words_within(["job", 'analyst'], x, 3))
Dies ist im Grunde, wie Sie das Problem lösen würde . Denken Sie daran, es ist eine grobe und einfache Lösung. Einige einfach gestellte Fragen werden nicht einfach beantwortet. NLP-Fragen gehören oft dazu.
- 1. Python Textverarbeitung/Daten finden
- 2. Rede zu Textverarbeitung - Python
- 3. Python-Textverarbeitung: NLTK und Pandas
- 4. Str.contains in Python Pandas auch Flaggen leer
- 5. Schnelle Textverarbeitung in Python auf Datenframe
- 6. Haskell schnelle Textverarbeitung
- 7. Mit str.contains auf Pandas Datenrahmen
- 8. Ignorieren NaNs mit str.contains
- 9. Schnellere Textverarbeitung in BASH
- 10. Textverarbeitung und Erkennung aus einem bestimmten Wörterbuch in Python
- 11. Python Textverarbeitung: AttributeError: 'list' Objekt hat kein Attribut 'lower'
- 12. Pandas Datenrahmen str.contains() UND-Operation
- 13. Regex vs readline für Textverarbeitung
- 14. Textverarbeitung (Zeilenumbruch) in Shell-Skript
- 15. 'str.contains' gibt keine Werte im Datenframe zurück
- 16. Pandas str.contains in pyspark Datenrahmen in Pyspark
- 17. df.apply und str.contains ('Wert', case = False)
- 18. Verwenden von str.contains() in Pandas mit Datenrahmen
- 19. Pandas - Äquivalent str.contains() in Pandas Abfrage
- 20. Kosten/Nutzen der multi-threaded Textverarbeitung
- 21. Devanagaric Textverarbeitung (NLP) wo zu beginnen
- 22. Textverarbeitung - Word2Vec Training nach Phrasenerkennung (Bigramm-Modell)
- 23. Verbesserung der Effizienz für diese Textverarbeitung Code
- 24. Wie Textverarbeitung in Java zu tun
- 25. Wie verarbeitet man CIDR-Block/Textverarbeitung?
- 26. Textanalyse in Python - skalierbare Lösung für str.contains mit einer Liste von Strings
- 27. 2. Spalte hinzufügen, wenn Spalte in str.contains Spiele
- 28. str.contains, um neue Spalte in Pandas Dataframe zu erstellen
- 29. Wie mehrere str.contains auf derselben Spalte Rufdaten nehmen in Pandas
- 30. Verwenden von Lambda bedingten und pandas str.contains zu pauschalen Strings
Könnten Sie bitte ein Beispiel Ihres DataFrame freigeben. Pandas kann eine wirklich nützliche Bibliothek sein, aber es ist nicht für alles gedacht. Textanalyse ... vielleicht .. hängt davon ab .. höchstwahrscheinlich nicht. Und bitte, bevor Sie weitere Fragen stellen, nehmen Sie 30 Minuten, um dies zu lesen: [fragen]. –
Willkommen bei SO. Leider ist dies kein Diskussionsforum oder Tutorial. Bitte nehmen Sie sich die Zeit, [ask] und die anderen Links auf dieser Seite zu lesen. – wwii
Ich weiß, wie man diese Frage beantwortet. Aber ich werde nicht, weil Ihre Frage nicht den Standards dieser Seite entspricht. Bitte stelle eine [mcve] zur Verfügung und lies auch [ask] .. –