Engee 文档
Notebook

ABC-词搜索算法

此代码实现了一种算法,该算法在包含字母"a","b"和"c"的文件中按该顺序查找单词(不一定在一行中)。

导言

在这个例子中,我们考虑搜索称为ABC词的特殊词的任务。 这些是字母a,b和c以指定的顺序**出现的单词,但不一定一个接一个。 例如,这个词 "abacus" -ABC是一个单词,因为字母a,b和c的顺序正确。 还有这个词 "cab" -不是ABC词,因为顺序被打破了。

这些任务可以用于语言研究,自然语言处理任务,或简单地用于有趣的字母表和单词分析练习。

该算法的本质是检查每个单词中是否存在字母'a','b'和'c',以及它们在单词中的位置是否以非递减顺序排列。

主要部分

功能 isabcword 它用于确定一个单词是否是ABC单词。

输入:word w,第二个参数 _ 被忽略

In [ ]:
function isabcword(w, _)
    # Создаем список позиций букв 'a', 'b', 'c' в слове, если они есть
    # Если буква не найдена, findfirst вернет nothing
    positions = [findfirst(c -> c == ch, w) for ch in "abc"]

    # Проверяем, все ли из трех букв найдены (никто не равен nothing)
    # И проверяем, что позиции этих букв расположены в порядке возрастания
    return all(!isnothing, positions) && issorted(positions) ? w : ""
end
Out[0]:
isabcword (generic function with 1 method)

功能说明 isabcword

想象一下这个词 "abacus". 字母在这些位置:

  • a -第一个(位置1)
  • b -第二(位置2)
  • c -第三(位置3)

名单 [1, 2, 3] 满足条件 issorted,因为数字是上升的。

但如果有一个词 "cabbage":

  • a 第三个位置,
  • b 4日,
  • c 1日,

那么名单将是 [1, 3, 4],但位置没有排序(1<3<4是正确的)。 字母的顺序正确是很重要的.

该函数返回单词本身(如果是ABC单词)或空字符串(如果不是)。

使用函数

功能 foreachword 打开文件并将传递的函数应用于每个单词。

她看起来像 mapforeach,但适应与单词列表的文件工作。

In [ ]:
function foreachword(filename, func)
    open(filename) do file
        for line in eachline(file)
            word = strip(line)  # убираем пробелы
            result = func(word, nothing)
            if !isempty(result)
                println(result)
            end
        end
    end
end
Out[0]:
foreachword (generic function with 1 method)

调用我们的函数为文件"unixdict。txt"

In [ ]:
foreachword("unixdict.txt", isabcword)
aback
abacus
abc
abdicate
abduct
abeyance
abject
abreact
abscess
abscissa
abscissae
absence
abstract
abstracter
abstractor
adiabatic
aerobacter
aerobic
albacore
alberich
albrecht
algebraic
alphabetic
ambiance
ambuscade
aminobenzoic
anaerobic
arabic
athabascan
auerbach
diabetic
diabolic
drawback
fabric
fabricate
flashback
halfback
iambic
lampblack
leatherback
metabolic
nabisco
paperback
parabolic
playback
prefabricate
quarterback
razorback
roadblock
sabbatical
snapback
strabismic
syllabic
tabernacle
tablecloth

会印什么字? 只有那些 isabcword 返回一个非空字符串,即与我们对ABC单词的定义匹配的字符串。

结论

我们已经考虑了Julia语言中一个简单但有用的程序的例子,它解决了搜索ABC单词的问题。 该算法使用处理字符串和集合的基本功能(findfirst, all, issorted),并允许您根据特定条件有效地过滤单词。

这个例子演示了Julia在不涉及复杂库的情况下解决文本数据处理任务的灵活性和表现力。 它也可以成为更复杂的语言实验的方便起点。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/ABC_words