আপনি এই "ভাঙ্গা" শব্দের বেশিরভাগটি মূলের সাথে প্রতিস্থাপন করতে পারেন। আপনি নিরাপদে কোনও শব্দ প্রতিস্থাপন করতে পারেন যদি:
- মত
dene
বা rey
, এটি একটি সত্য শব্দ নয়
- মত
define
বা firefly
, আছে এক (পথ পুনরায় অ্যাড পটীবন্ধনী sequeneces করতে ff
, fi
, fl
, ffi
, অথবা ffl
) এবং একটি বাস্তব শব্দের করা
বেশিরভাগ লিগচার সমস্যা এই মানদণ্ডে ফিট করে। তবে, আপনি প্রতিস্থাপন করতে পারবেন না:
us
কারণ এটি একটি আসল শব্দ, যদিও এটি মূলত হতে পারে fluffs
- এছাড়াও
affirm
, butterfly
, fielders
, fortifies
, flimflam
, misfits
...
cus
কারণ এটি হয়ে যেতে পারে cuffs
বা হয়ficus
- এছাড়াও
stiffed
/ stifled
, rifle
/ riffle
, flung
/ fluffing
...
ইন এই 496 হাজার শব্দটি ইংরেজি অভিধান , আছে 16055 শব্দ ধারণ অন্তত একটি ff
, fi
, fl
, ffi
, অথবা ffl
, যা পরিণত 15879 শব্দ যখন তাদের ligatures সরিয়ে ফেলা হয়। 173 মত মুখোমুখি সংঘর্ষ হয় সেই অনুপস্থিত শব্দের cuffs
এবং ficus
, এবং শেষ 3 কারণ যে অভিধান শব্দ আছে ff
, fi
এবং fl
।
এই "লিগ্রেশন-মুছে ফেলা" শব্দগুলির মধ্যে 790 টি আসল শব্দ, যেমন us
, তবে 15089 ভাঙা শব্দ। 14960 ভাঙা শব্দের মূল শব্দের সাথে নিরাপদে প্রতিস্থাপন করা যেতে পারে, যার অর্থ ভাঙা শব্দের 99.1% স্থিরযোগ্য এবং একটি লিপিচার থাকা মূল শব্দগুলির 93.3% একটি পিডিএফ অনুলিপি-পেস্ট করার পরে পুনরুদ্ধার করা যেতে পারে। লিগচার সিকোয়েন্স যুক্ত of.৮ % শব্দ সংঘর্ষে ( cus
) এবং উপ-শব্দের ( us
) -র কাছে হারিয়ে গেছে , যদি আপনি কোনও গ্যারান্টিযুক্ত না থাকে এমন প্রতিটি শব্দের জন্য সেরা প্রতিস্থাপন বেছে নিতে কোনও উপায় (শব্দ / নথি প্রসঙ্গে?) না বেছে নেন প্রতিস্থাপন।
নীচে আমার পাইথন স্ক্রিপ্ট যা উপরের পরিসংখ্যানগুলি তৈরি করেছে। এটি প্রতি লাইনে একটি শব্দের সাথে একটি অভিধান পাঠ্য ফাইল প্রত্যাশা করে। শেষে এটি একটি সিএসভি ফাইল লিখেছে যা স্থিরযোগ্য ভাঙা শব্দগুলিকে তাদের মূল শব্দগুলিতে মানচিত্র করে।
সিএসভি ডাউনলোডের জন্য এখানে একটি লিঙ্ক রয়েছে:
http://www.filedropper.com/brokenligaturewordfixes
বেশিরভাগ ভাঙা শব্দের প্রতিস্থাপনের জন্য এই ম্যাপিংটিকে একটি রেজেক্স রিপ্লেসমেন্ট স্ক্রিপ্টের মতো একত্রিত করুন ।
import csv
import itertools
import operator
import re
dictionary_file_path = 'dictionary.txt'
broken_word_fixes_file_path = 'broken_word_fixes.csv'
ligatures = 'ffi', 'ffl', 'ff', 'fi', 'fl'
with open(dictionary_file_path, 'r') as dictionary_file:
dictionary_words = list(set(line.strip()
for line in dictionary_file.readlines()))
broken_word_fixes = {}
ligature_words = set()
ligature_removed_words = set()
broken_words = set()
multi_ligature_words = set()
# Find broken word fixes for words with one ligature sequence
# Example: "dene" --> "define"
words_and_ligatures = list(itertools.product(dictionary_words, ligatures))
for i, (word, ligature) in enumerate(words_and_ligatures):
if i % 50000 == 0:
print('1-ligature words {percent:.3g}% complete'
.format(percent=100 * i / len(words_and_ligatures)))
for ligature_match in re.finditer(ligature, word):
if word in ligature_words:
multi_ligature_words.add(word)
ligature_words.add(word)
if word == ligature:
break
# Skip words that contain a larger ligature
if (('ffi' in word and ligature != 'ffi') or
('ffl' in word and ligature != 'ffl')):
break
# Replace ligatures with dots to avoid creating new ligatures
# Example: "offline" --> "of.ine" to avoid creating "fi"
ligature_removed_word = (word[:ligature_match.start()] +
'.' +
word[ligature_match.end():])
# Skip words that contain another ligature
if any(ligature in ligature_removed_word for ligature in ligatures):
continue
ligature_removed_word = ligature_removed_word.replace('.', '')
ligature_removed_words.add(ligature_removed_word)
if ligature_removed_word not in dictionary_words:
broken_word = ligature_removed_word
broken_words.add(broken_word)
if broken_word not in broken_word_fixes:
broken_word_fixes[broken_word] = word
else:
# Ignore broken words with multiple possible fixes
# Example: "cus" --> "cuffs" or "ficus"
broken_word_fixes[broken_word] = None
# Find broken word fixes for word with multiple ligature sequences
# Example: "rey" --> "firefly"
multi_ligature_words = sorted(multi_ligature_words)
numbers_of_ligatures_in_word = 2, 3
for number_of_ligatures_in_word in numbers_of_ligatures_in_word:
ligature_lists = itertools.combinations_with_replacement(
ligatures, r=number_of_ligatures_in_word
)
words_and_ligature_lists = list(itertools.product(
multi_ligature_words, ligature_lists
))
for i, (word, ligature_list) in enumerate(words_and_ligature_lists):
if i % 1000 == 0:
print('{n}-ligature words {percent:.3g}% complete'
.format(n=number_of_ligatures_in_word,
percent=100 * i / len(words_and_ligature_lists)))
# Skip words that contain a larger ligature
if (('ffi' in word and 'ffi' not in ligature_list) or
('ffl' in word and 'ffl' not in ligature_list)):
continue
ligature_removed_word = word
for ligature in ligature_list:
ligature_matches = list(re.finditer(ligature, ligature_removed_word))
if not ligature_matches:
break
ligature_match = ligature_matches[0]
# Replace ligatures with dots to avoid creating new ligatures
# Example: "offline" --> "of.ine" to avoid creating "fi"
ligature_removed_word = (
ligature_removed_word[:ligature_match.start()] +
'.' +
ligature_removed_word[ligature_match.end():]
)
else:
# Skip words that contain another ligature
if any(ligature in ligature_removed_word for ligature in ligatures):
continue
ligature_removed_word = ligature_removed_word.replace('.', '')
ligature_removed_words.add(ligature_removed_word)
if ligature_removed_word not in dictionary_words:
broken_word = ligature_removed_word
broken_words.add(broken_word)
if broken_word not in broken_word_fixes:
broken_word_fixes[broken_word] = word
else:
# Ignore broken words with multiple possible fixes
# Example: "ung" --> "flung" or "fluffing"
broken_word_fixes[broken_word] = None
# Remove broken words with multiple possible fixes
for broken_word, fixed_word in broken_word_fixes.copy().items():
if not fixed_word:
broken_word_fixes.pop(broken_word)
number_of_ligature_words = len(ligature_words)
number_of_ligature_removed_words = len(ligature_removed_words)
number_of_broken_words = len(broken_words)
number_of_fixable_broken_words = len(
[word for word in set(broken_word_fixes.keys())
if word and broken_word_fixes[word]]
)
number_of_recoverable_ligature_words = len(
[word for word in set(broken_word_fixes.values())
if word]
)
print(number_of_ligature_words, 'ligature words')
print(number_of_ligature_removed_words, 'ligature-removed words')
print(number_of_broken_words, 'broken words')
print(number_of_fixable_broken_words,
'fixable broken words ({percent:.3g}% fixable)'
.format(percent=(
100 * number_of_fixable_broken_words / number_of_broken_words
)))
print(number_of_recoverable_ligature_words,
'recoverable ligature words ({percent:.3g}% recoverable)'
'(for at least one broken word)'
.format(percent=(
100 * number_of_recoverable_ligature_words / number_of_ligature_words
)))
with open(broken_word_fixes_file_path, 'w+', newline='') as broken_word_fixes_file:
csv_writer = csv.writer(broken_word_fixes_file)
sorted_broken_word_fixes = sorted(broken_word_fixes.items(),
key=operator.itemgetter(0))
for broken_word, fixed_word in sorted_broken_word_fixes:
csv_writer.writerow([broken_word, fixed_word])