Наиболее эффективный способ поиска, если какое -либо слово в сообщении начинается с любого слова из большого набора даннPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Наиболее эффективный способ поиска, если какое -либо слово в сообщении начинается с любого слова из большого набора данн

Сообщение Anonymous »

У меня есть список сообщений, и мне нужно через каждое сообщение, для каждого сообщения, которое мне нужно найти, если слово в этом сообщении соответствует слову из моего набора данных или начинается с слова из моего набора данных, я не могу найти быстрый способ сделать это правильно, используя Ahocorasic Что) < /p>
Также может быть несколько совпадений с одним словом (например, если в сообщении есть «12345», а набор данных ["123", "1234"] может совпадать, и лучшее совпадение с двумя 2) < /p>
У меня есть что -то, что у меня есть, что мне очень много, и теперь это так, что у меня есть, так что это так, что у меня есть, так что это так, что у меня есть, так что это так, что у меня есть, так что это так, что у меня есть, так что у меня есть на самом деле. На более быстром способе поиска с сложностью меньшего времени
, что я делал, это работает, в основном проверяет любые точные совпадения в сообщении, а затем снова проходить через набор данных и пройти через каждое слово и использовать STARTSWITH, то убедиться, что нет перекрывающихся результатов, и если существует сохранение только наилучшего соответствия. Код: < /p>
for ref_norm, (ref_raw, brand) in ref_map.items():
if ref_norm in tokens:
if brand == "Richard Mille" and not ref_norm.startswith('rm'):
matched_refs.append(("rm"+ref_norm, "RM"+ref_raw, brand))
else:
matched_refs.append((ref_norm, ref_raw, brand))
# Prepare matches
possible_matches = []

for ref_norm, (ref_raw, brand) in ref_map.items():
if brand == "Richard Mille":
ref_clean = ref_raw.lower()
if ref_clean.startswith("rm") and ref_clean in message.lower():
possible_matches.append((ref_norm, ref_raw, brand))
else:
for word in tokens:
if word.startswith(ref_norm):
possible_matches.append((ref_norm, word, brand))
break

match = re.match(r'^([a-zA-Z]{1,2})(.+)', word)
if match and any(char.isdigit() for char in match.group(2)):
word = match.group(2)
if word.startswith(ref_norm):
possible_matches.append((ref_norm, word, brand))
break

# Sort by length of raw ref descending → longer matches first
possible_matches.sort(key=lambda x: len(x[1]), reverse=True)

# Now pick only non-overlapping matches
used_spans = []
for ref_norm, ref_raw, brand in matched_refs:
ref_lower = ref_raw.lower()
index = message.lower().find(ref_lower)
used_spans.append((index, index + len(ref_lower)))

for ref_norm, ref_raw, brand in possible_matches:
ref_lower = ref_raw.lower()
index = message.lower().find(ref_lower)
if index == -1:
continue

# Check if this index overlaps with previous matches
overlap = any(start

Подробнее здесь: https://stackoverflow.com/questions/795 ... -word-from
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»