сортировка групп слов по окончаниям 3 букв
и разбиваем тексты на группы по три соседних слова
повторы групп слов отбрасываем
потом объединяем группы слов по 10 строк -
так чтобы из последних трёх букв строки совпало любые две из трёх букв
результат сохраняем в новый файл txt
1. Открыть все текстовые файлы (`*.txt`) в папке с программой.
2. Из каждого файла взять текст и разбить его на группы по 3 соседних слова (триграммы).
3. Убрать повторяющиеся группы.
4. Затем объединять эти группы по 10 строк, но так, чтобы последние 3 буквы строки i совпадали по 2 из 3 букв с первыми 3 буквами строки i+1.
5. Результат сохранить в новый файл.
Ниже пример кода на Python,
он реализует описанную логику
```python
import os
import glob
import re
def get_trigrams(text):
# Разбиваем текст на слова, учитывая только буквы и цифры
words = re.findall(r'\b\w+\b', text.lower())
trigrams = []
for i in range(len(words) - 2):
trigram = ' '.join(words[i:i+3])
trigrams.append(trigram)
return trigrams
def letters_similarity(a, b):
# Сравниваем две строки длиной 3, считаем сколько позиций совпадает
# Возвращаем True, если совпадает >= 2 позиций
matches = sum(1 for x, y in zip(a, b) if x == y)
return matches >= 2
def merge_lines(lines):
# Объединяем строки по 10, с условием, что последние 3 буквы строки i
# совпадают по 2 из 3 букв с первыми 3 буквами строки i+1
merged = []
i = 0
n = len(lines)
while i < n:
group = [lines[i]]
i += 1
while len(group) < 10 and i < n:
last_three = group[-1][-3:]
first_three = lines[i][:3]
if letters_similarity(last_three, first_three):
group.append(lines[i])
i += 1
else:
break
merged.append(' '.join(group))
return merged
def main():
folder = os.path.dirname(os.path.abspath(__file__))
txt_files = glob.glob(os.path.join(folder, '*.txt'))
all_trigrams = set()
for file in txt_files:
with open(file, 'r', encoding='utf-8') as f:
text = f.read()
trigrams = get_trigrams(text)
all_trigrams.update(trigrams)
all_trigrams = list(all_trigrams)
all_trigrams.sort()
merged = merge_lines(all_trigrams)
output_path = os.path.join(folder, 'result.txt')
with open(output_path, 'w', encoding='utf-8') as f:
for line in merged:
f.write(line + '\n')
print(f"Результат сохранён в {output_path}")
if __name__ == '__main__':
main()
*
нужно изменить условие совпадения так, чтобы считались совпадения только если совпадают либо первые две буквы из трёх последних строки с первыми двумя буквами следующей строки (позиции 1 и 2), либо последние две буквы из трёх последних строки совпадают с первыми двумя буквами следующей строки (позиции 2 и 3).
Пояснения:
- `get_trigrams` — разбивает текст на слова, затем формирует триграммы.
- `letters_similarity` — проверяет, совпадает ли минимум 2 из 3 букв между концом строки и началом следующей.
- `merge_lines` — группирует строки по 10, соединяя только те, у которых условие совпадения соблюдается.
- В конце результат сохраняется в файл `result.txt` в той же папке.
Если нужно, могу помочь адаптировать код под ваши требования.
def letters_similarity(a, b):
"""
a и b — строки длиной 3.
Возвращает True, если совпадает либо первые 2 буквы a с первыми 2 буквами b (позиции 0 и 1),
либо последние 2 буквы a с первыми 2 буквами b (позиции 1 и 2)
"""
if len(a) < 3 or len(b) < 3:
return False
# Проверяем позиции 0 и 1
if a[0] == b[0] and a[1] == b[1]:
return True
# Проверяем позиции 1 и 2
if a[1] == b[0] and a[2] == b[1]:
return True
return False
**
import os
import glob
import re
def get_trigrams(text):
words = re.findall(r'\b\w+\b', text.lower())
trigrams = []
for i in range(len(words) - 2):
trigram = ' '.join(words[i:i+3])
trigrams.append(trigram)
return trigrams
def letters_similarity(a, b):
if len(a) < 3 or len(b) < 3:
return False
if a[0] == b[0] and a[1] == b[1]:
return True
if a[1] == b[0] and a[2] == b[1]:
return True
return False
def merge_lines(lines):
merged = []
i = 0
n = len(lines)
while i < n:
group = [lines[i]]
i += 1
while len(group) < 10 and i < n:
last_three = group[-1][-3:]
first_three = lines[i][:3]
if letters_similarity(last_three, first_three):
group.append(lines[i])
i += 1
else:
break
merged.append(' '.join(group))
return merged
def main():
folder = os.path.dirname(os.path.abspath(__file__))
txt_files = glob.glob(os.path.join(folder, '*.txt'))
all_trigrams = set()
for file in txt_files:
with open(file, 'r', encoding='utf-8') as f:
text = f.read()
trigrams = get_trigrams(text)
all_trigrams.update(trigrams)
all_trigrams = list(all_trigrams)
all_trigrams.sort()
merged = merge_lines(all_trigrams)
output_path = os.path.join(folder, 'result.txt')
with open(output_path, 'w', encoding='utf-8') as f:
for line in merged:
f.write(line + '\n')
print(f"Результат сохранён в {output_path}")
if __name__ == '__main__':
main()
Свидетельство о публикации №125080300674