Có một lệnh Unix tìm kiếm các chuỗi tương tự, chủ yếu dựa trên cách chúng phát ra âm thanh khi nói?


7

Tôi có một tập tin tên và tôi muốn tìm kiếm trong đó, không quan tâm quá nhiều đến việc tôi đã đánh vần đúng tên (mà tôi đang tìm kiếm) chưa. Tôi biết rằng grepcó khá nhiều chức năng để tìm kiếm một loạt các chuỗi tương tự trong một tệp hoặc luồng, nhưng theo như tôi biết, nó không có chức năng để sửa lỗi chính tả và ngay cả khi nó đã xảy ra Đây là tên của những người, họ sẽ không được tìm thấy trong một từ điển tiêu chuẩn.

Có lẽ tôi có thể biến tập tin tên của mình thành một từ điển đặc biệt, và sau đó sử dụng một số công cụ kiểm tra chính tả tiêu chuẩn? Điều đặc biệt quan trọng trong ứng dụng này là khả năng ghép các từ có âm tương tự.

Ví dụ: "jacob"nên trả lại "Jakob". Thậm chí sẽ tốt hơn nếu sự tương đồng giữa các ngôn ngữ cũng được tính đến, do đó "miguel"sẽ phù hợp "Michael".

Đây có phải là một cái gì đó đã được thực hiện hay tôi sẽ phải tự xây dựng?


3
agrepcho gần đúng grep(không cho âm thanh / ngôn ngữ). Ngoài ra trong zshkhớp mẫu (#a3)cho phép tối đa 3 lỗi.
Stéphane Chazelas

7
Hãy xem mô-đun cốt lõi quá: pastebin.com/UbeVFBQAText::Soundex perl
manatwork

1
@manatwork - bạn nên viết nó lên như một câu trả lời!
slm

2
@slm, không chắc có ích như thế nào trong thực tế. Ví dụ: Khi tôi cố gắng sử dụng nó, tôi phát hiện ra rằng nó quá rộng để có ích cho hầu hết các tác vụ. Vì vậy, tốt hơn tôi nên để ai đó có khả năng tinh chỉnh nó để làm cho nó một câu trả lời.
manatwork

Câu trả lời:


5

@manatwork đã đúng, soundex có lẽ là công cụ bạn đang tìm kiếm.

Cài đặt mô-đun Soundex perl bằng CPAN:

$ sudo cpan Text::Soundex
CPAN: Storable loaded ok (v2.27)
....
Text::Soundex is up to date (3.04).

Tạo một tệp có đầy đủ các tên để kiểm tra được gọi names.txt

jacob
Jakob
miguel
Michael

Bây giờ tập lệnh perl để sử dụng mô-đun Soundex, soundslike.pl

#!/usr/bin/perl

use Text::Soundex;

open(FH, 'names.txt');

$targetSoundex=soundex($ARGV[0]);
print "Target soundex of $ARGV[0] is $targetSoundex\n";

while(<FH>) {
    chomp;
    print "Soundex of $_ is ".soundex($_);
    if($targetSoundex eq soundex($_)) {
        print " (match).\n";
    }else {
        print " (no match).\n";
    }
}
close(FH);

Làm cho nó thực thi và chạy một số ví dụ:

$ chmod +x soundslike.pl 
$ ./soundslike.pl michael
Target soundex of michael is M240
Soundex of jacob is J210 (no match).
Soundex of Jakob is J210 (no match).
Soundex of miguel is M240 (match).
Soundex of Michael is M240 (match).
$ ./soundslike.pl jagub
Target soundex of jagub is J210
Soundex of jacob is J210 (match).
Soundex of Jakob is J210 (match).
Soundex of miguel is M240 (no match).
Soundex of Michael is M240 (no match).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.