आप इनमें से अधिकांश "टूटे हुए" शब्दों को मूल के साथ बदल सकते हैं। आप सुरक्षित रूप से एक शब्द बदल सकते हैं यदि:
- की तरह
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
है, जो में बदल जाते हैं 15,879 शब्द जब उनके संयुक्ताक्षर निकाल दिए जाते हैं। 173 की तरह टकरा उन लापता शब्दों के cuffs
और ficus
, और पिछले 3 रहे हैं, क्योंकि कि शब्दकोश शब्द हैं ff
, fi
, और fl
।
इनमें से 790 "लिगचर-हटाए गए" शब्द वास्तविक शब्द हैं, जैसे us
, लेकिन 15089 टूटे हुए शब्द हैं। टूटे हुए शब्दों में से 14960 को मूल शब्द से सुरक्षित रूप से प्रतिस्थापित किया जा सकता है, जिसका अर्थ है कि टूटे हुए शब्दों में से 99.1% निश्चित हैं और 93.2% मूल शब्द जिनमें पीडीएफ को कॉपी-पेस्ट करने के बाद एक लिगचर को पुनर्प्राप्त किया जा सकता है। ९ ६% लिगचर अनुक्रम वाले शब्द टकरावों ( cus
) और उप-शब्दों ( us
), तब तक खो जाते हैं , जब तक कि आप प्रत्येक शब्द के लिए सबसे अच्छा प्रतिस्थापन चुनने के लिए कोई रास्ता नहीं निकालते (शब्द / दस्तावेज़ संदर्भ?), जिनके पास गारंटी नहीं है। प्रतिस्थापन।
नीचे मेरी पायथन लिपि है जो उपरोक्त आँकड़े उत्पन्न करती है। यह प्रति पंक्ति एक शब्द के साथ एक शब्दकोश पाठ फ़ाइल की अपेक्षा करता है। अंत में यह एक CSV फ़ाइल लिखता है जो अपने मूल शब्दों के लिए टूटे हुए शब्दों को मैप करता है।
यहाँ CSV डाउनलोड करने के लिए एक लिंक दिया गया है:
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])