группы слов фразы

 есть список  групп  слов  по 2 и 3 слова  в строке 
 в файле  слова.txt
далее необходимо найти среди этих групп пары групп  которые подходят
друг к другу по смыслу 
 если они не комбинируются то можно поменять слова  в этих группах данных 

Ответ

Задача состоит в поиске пар групп слов, которые сочетаются по смыслу. Чтобы решить её эффективно, рассмотрим пошагово, как мы можем организовать процесс анализа.

Шаги решения задачи
Подготовка исходных данныхДля начала нужно подготовить файл слова.txt,
содержащий группы слов. Каждая группа должна находиться на отдельной строке файла.
Алгоритм подбора парМы будем искать сочетания двух групп слов таким образом, чтобы они имели общий смысл.
Если комбинации не совпадают изначально, возможно перестановка слов внутри каждой группы улучшит сочетаемость.

Оценка смысла
мы будем проверять каждую пару групп на смысловое совпадение.
Можно применить алгоритмы семантического сходства, основанные на векторизации текста

Однако для упрощённого подхода используем ручной подбор или автоматическое сравнение на основе заранее определённых критериев.
Перестановка словЕсли первоначальное сочетание слов не подходит, попробуем менять порядок слов внутри одной или обеих групп и снова проверяем на сочетаемость.

Пример реализации этого алгоритма
Предположим, наш файл выглядит следующим образом:


это предположение
яблоко фрукт
чай напиток
машина транспорт
кофе напиток
банан фрукт
телефон гаджет
компьютер техника
верное предложение
может это так
я этого не знаю
хорошо если


Для автоматизации процесса проверки и нахождения комбинаций можно написать программу на Python. Вот пример простого скрипта, который ищет подходящие пары путём перебора всех возможных сочетаний:



from itertools import permutations

# Чтение списка строк из файла
with open('слова.txt', 'r') as file:
    lines = file.readlines()

groups = []
for line in lines:
    groups.append(line.strip().split())

def is_compatible(group1, group2):
    # Простая проверка совместимости
    if len(set(group1).intersection(group2)) > 0 or set(group1) & {'фрукт'} and set(group2) & {'напиток'}:
        return True
    else:
        return False

# Поиск всех возможных комбинаций
matches = []
for i in range(len(groups)):
    for j in range(i + 1, len(groups)):
        found_match = False
        g1_perms = list(permutations(groups[i]))
        g2_perms = list(permutations(groups[j]))
       
        for perm1 in g1_perms:
            for perm2 in g2_perms:
                if is_compatible(list(perm1), list(perm2)):
                matches.append((list(perm1), list(perm2)))
                found_match = True
                break
            if found_match:
                break

print("Совместимые пары:")
for match in matches:
    print(f"{match[0]} -- {match[1]}")



Объяснение кода программы:
Читаем строки из файла и сохраняем их в списке.
Функция is_compatible проверяет наличие общих элементов или заданных категорий («фрукты» и «напитки»).

Используем модуль itertools.permutations, чтобы создать возможные перестановки слов внутри каждой группы.
Перебираем все возможные комбинации групп и проверяем их на совместимость.

Результат:
Программа выведет все найденные совместимые пары, учитывая также варианты перестановок слов внутри групп.

Таким образом, предложенный алгоритм позволяет автоматически находить подходящие по смыслу пары групп слов даже при наличии возможности изменения порядка слов внутри каждой группы.




 сортировка  фраз  на группы  по смыслу ->



import os
import re

def get_all_txt_lines(folder):
    lines = set()
    for filename in os.listdir(folder):
        if filename.endswith(".txt"):
            filepath = os.path.join(folder, filename)
            with open(filepath, encoding='utf-8') as f:
                for line in f:
                line = line.strip()
                if line:
                lines.add(line)
    return list(lines)

def extract_words(line):
    return set(re.findall(r'\b\w{4,}\b', line.lower()))

def group_lines(lines, max_group_size=10, min_common_words=2):
    groups = []
    group_words = []
    ungrouped = []

    for line in lines:
        words = extract_words(line)
        placed = False
        for i, (grp, common_words) in enumerate(zip(groups, group_words)):
            new_common = common_words.intersection(words)
            if len(new_common) >= min_common_words and len(grp) < max_group_size:
                grp.append(line)
                group_words[i] = new_common
                placed = True
                break
        if not placed:
            if len(words) >= min_common_words:
                groups.append([line])
                group_words.append(words)
            else:
                ungrouped.append(line)
    return groups, ungrouped

def merge_singleton_groups(groups, max_group_size=10):
    # Собираем все группы с одной фразой
    singletons = [grp[0] for grp in groups if len(grp) == 1]
    # Оставшиеся группы (с 2 и более фразами)
    multi_groups = [grp for grp in groups if len(grp) > 1]

    # Разобьём singletons на группы по max_group_size
    merged_groups = []
    for i in range(0, len(singletons), max_group_size):
        merged_groups.append(singletons[i:i+max_group_size])

    # Итоговые группы — многопредложные + объединённые singletons
    return multi_groups + merged_groups

def save_groups(groups, filename):
    with open(filename, "w", encoding="utf-8") as f:
        for i, group in enumerate(groups, 1):
            f.write(f" {i} --> \n")
            for line in group:
                f.write(line + "\n")
            f.write("\n")

def save_ungrouped(lines, filename):
    def first_word(line):
        words = re.findall(r'\b\w+\b', line.lower())
        return words[0] if words else ""
    lines_sorted = sorted(lines, key=first_word)
    with open(filename, "w", encoding="utf-8") as f:
        for line in lines_sorted:
            f.write(line + "\n")

if __name__ == "__main__":
    folder = "."
    lines = get_all_txt_lines(folder)
    groups, ungrouped = group_lines(lines, max_group_size=10, min_common_words=2)
    groups = merge_singleton_groups(groups, max_group_size=10)
    save_groups(groups, "сорт-фраз.txt")
    save_ungrouped(ungrouped, "несгруппированные.txt")
    print(f"Сформировано {len(groups)} групп, сохранено в сорт-фраз.txt")
    print(f"Несгруппированных фраз: {len(ungrouped)}, сохранено в несгруппированные.txt")


Рецензии