programing

문자열이 무작위로 보이는지, 아니면 사람이 만들어 내고 발음할 수 있는지 어떻게 확인할 수 있습니까?

copyandpastes 2023. 1. 2. 23:20
반응형

문자열이 무작위로 보이는지, 아니면 사람이 만들어 내고 발음할 수 있는지 어떻게 확인할 수 있습니까?

봇에서 생성된 사용자 이름을 식별하기 위한 목적(가능한)

예를 들어, "bilbomoothof"와 같은 사용자 이름을 가지고 있다고 가정해 봅시다.그것은 말도 안 되는 소리일 수도 있지만, 여전히 발음할 수 있는 소리를 포함하고 있기 때문에, 인간이 만든 것처럼 보입니다.

음절이나 단어 부분 사전에서 무작위로 생성되었을 수 있다는 것은 인정하지만, 잠시 문제의 봇이 좀 엉터리라고 가정해 봅시다.

  1. 「sdfgbhm342r3f」와 같은 유저명이 있다고 가정하면, 인간에게는 이것은 분명히 랜덤 문자열입니다.하지만 이것이 프로그램적으로 식별될 수 있을까요?
  2. 사용 가능한 알고리즘이 있습니까(Soundex 등과 유사).이 같은 문자열 내에서 발음 가능한 소리를 식별할 수 있습니다.

PHP/MySQL에 적용할 수 있는 솔루션을 가장 감사하게 생각합니다.

영어로 발음할 수 있는 소리만 내면 그런 생각을 할 수 있을 것 같아요.나에게 있어서, szczepan이나 wawrzyniec와 같은 단어는 발음할 수 없고 확실히 무작위성을 가지고 있다.

하지만 실제로는 폴란드 이름이에요 (스티븐과 로렌스라는 )

맥의 말에 동의해요.하지만 그 외에도 사람들은 때때로 qwerty나 rtfmorleave와 같이 발음할 수 없는 사용자 이름을 가지고 있다.

그건 왜 신경써?

<더 이상 사용되지 않고 거짓이지만 댓글 때문에 삭제하지 않습니다>

하지만 그 이상으로 사용자 이름으로 'zetztzgsd'를 사용하는 봇은 없고, 실명 사전, 가능한 닉네임 등을 가지고 있기 때문에 시간을 낭비할 수 있다고 생각합니다.

</더 이상 사용되지 않고 거짓이지만 댓글 때문에 삭제하지 않습니다>

n-그램 분석을 찾아보세요.텍스트 언어를 자동으로 검출하는 데 성공하여 매우 짧은 텍스트에서도 놀라울 정도로 잘 작동합니다.

온라인 데모(더 이상 온라인 상태가 아님)에서는 'bilbomoothof'를 영어로, 'sdfgbhm342r3f'를 네팔어로 인식했습니다.아마 항상 가장 잘 맞는 짝이 반환될 겁니다. 아주 서투른 짝일지라도요.발음 가능과 랜덤을 구분하도록 훈련할 수 있을 것 같습니다.

등록 과정의 일부로 CAPTCHA를 사용하십시오.

실제 사용자 이름과 봇이 만든 사용자 이름을 구분하려면 사용자를 크게 불편하게 해야 합니다.

당신은 bizzare 또는 영어 이외의 이름을 가진 사용자를 차단할 것이고, 봇은 그들이 좋은 사용자 이름을 얻을 때까지 계속 시도할 것입니다(사전이나 다른 소스로부터 - 그나저나 이것은 매우 좋은 것입니다!).

EDIT : 사후 분석이 아닌 예방책을 찾고 계십니까?

해결책은 다른 사람이 사용자의 ID를 대신 관리할 수 있도록 하는 것입니다.예를 들어 Open의 작은 목록을 사용할 수 있습니다.ID 공급자(SO 등), Facebook 연결 또는 둘 다.사용자는 사용자가 진짜이며 적어도 하나의 캡차(CAPTCHA)를 해결했음을 확실히 알 수 있습니다.

편집: 다른 아이디어

Google에서 문자열을 검색하여 일치하는 항목 수를 확인합니다.유일한 도구는 아니지만 좋은 지표이기도 합니다.물론 랜덤화된 문자열에는 일치하는 항목이 거의 없거나 아예 없습니다.

즉석에서 soundex를 사용해서 음절을 찾을 수 있습니다.발음할 수 있는 단어가 적어도 한 음절은 가지고 있다는 가정 하에, 제가 탐구할 방향입니다.

편집: 음절을 세는 기능은 다음과 같습니다.

function count_syllables($word) {
 
$subsyl = Array(
'cial'
,'tia'
 ,'cius'
 ,'cious'
 ,'giu'
 ,'ion'
 ,'iou'
 ,'sia$'
 ,'.ely$'
 );
  
 $addsyl = Array(
 'ia'
 ,'riet'
 ,'dien'
 ,'iu'
 ,'io'
 ,'ii'
 ,'[aeiouym]bl$'
 ,'[aeiou]{3}'
 ,'^mc'
 ,'ism$'
 ,'([^aeiouy])\1l$'
 ,'[^l]lien'
 ,'^coa[dglx].'
 ,'[^gq]ua[^auieo]'
 ,'dnt$'
 );
  
 // Based on Greg Fast's Perl module Lingua::EN::Syllables
 $word = preg_replace('/[^a-z]/is', '', strtolower($word));
 $word_parts = preg_split('/[^aeiouy]+/', $word);
 foreach ($word_parts as $key => $value) {
 if ($value <> '') {
 $valid_word_parts[] = $value;
 }
 }
  
 $syllables = 0;
 // Thanks to Joe Kovar for correcting a bug in the following lines
 foreach ($subsyl as $syl) {
 $syllables -= preg_match('~'.$syl.'~', $word);
 }
 foreach ($addsyl as $syl) {
 $syllables += preg_match('~'.$syl.'~', $word);
 }
 if (strlen($word) == 1) {
 $syllables++;
 }
 $syllables += count($valid_word_parts);
 $syllables = ($syllables == 0) ? 1 : $syllables;
 return $syllables;
 }

이 매우 흥미로운 링크에서:

http://www.addedbytes.com/php/flesch-kincaid-function/

질문 #1에 대한 답변:

유감스럽게도 이것은 할 수 없습니다.콜모고로프 복잡도 함수는 계산할 수 없기 때문에 가능한 사용자 이름의 도메인에 몇 가지 규칙을 적용하지 않는 한 이러한 알고리즘을 생성할 수 없습니다.그러면 휴리스틱 분석을 수행하고 결정할 수 있지만, 그 경우에도 매우 어렵습니다.

PS: 이 답변을 투고하고 나서, 유저명 도메인 제한의 예를 들면, 유저명으로서 잘 알려진 퍼블릭 도메인의 메일 박스를 유저명으로서 사용할 수 있도록 하는 서비스를 접했습니다.

신경망을 사용하여 닉네임이 자연어 닉네임으로 보이는지 여부를 평가할 수 있습니다.

유효한 닉네임과 가짜 생성된 닉네임 중 하나의 데이터 세트를 조합합니다.문자 값을 입력으로 하여 간단한 백프로그래팅 단일 숨겨진 레이어 뉴럴 네트워크를 훈련합니다.신경망은 "zrgssgbt"와 "zargbyt"와 같은 문자열은 자음과 모음이 뒤섞여 있기 때문에 구별하는 법을 배울 것이다.

좋은 식별자를 얻기 위해서는 실제 사례를 사용하는 것이 중요하다.

이 문제에 대한 기존 알고리즘은 모르지만 다음 중 하나의 방법으로 공격을 받을 수 있다고 생각합니다.

  • 당신의 봇은 쓰레기가 될 수 있지만, 당신은 주어진 문자열에서 찾을 수 있는 음절, 또는 더 구체적으로 음소 목록을 보관할 수 있습니다.하지만 끈을 여러 곳에 나눠야 하기 때문에 조금 어려울 것 같습니다.
  • 영어 알파벳에는 5개의 모음과 21개의 모음이 있다.무작위로 생성된 경우 대략 5/26*W(여기서 W는 단어 길이)의 모음이 될 것으로 예상할 수 있으며, 이 문자로부터 상당한 편차가 의심될 수 있습니다.(레터가 포함된 경우 5/31 등)doubleton을 검색하여 각 doubleton이 동일한 확률로 발생하는지 등을 확인함으로써 이 아이디어를 기반으로 할 수 있습니다.
  • 또한 입력 문자열을 모음에 맞춰 구분해 볼 수 있습니다. 예를 들어 모음 앞에 세 글자, 모음 뒤에 세 글자, 그리고 음소와 비교해서 알아볼 수 있는 소리가 나는지 알아보세요.

러시아어에는 금지된 음절이 있다.ГЙ, »Ъ또는Ь모음 뒤에.

그러나 스팸봇은 이름 데이터베이스만 사용하기 때문에 내 스팸 수신함은 역사책에서만 볼 수 있는 이상한 이름으로 가득합니다.

영어에도 음절 분포 히스토그램이 있을 것으로 예상합니다.ETAOIN SHRDLU단, 두 글자 또는 세 글자 음절의 경우)와 한 이름에 저주파 음절의 임계 밀도를 갖는 것은 분명 신호이다.

많은 대형 사이트에서는 [first init][middle init][last name][number]와 같은 사용자 이름을 제안하고 있습니다.그 후, 유저는 이러한 유저명을 다른 사이트로 전송해, 처음의 3 문자는 확실히 발음할 수 없습니다.

언급URL : https://stackoverflow.com/questions/1164186/how-to-check-if-a-string-looks-randomized-or-human-generated-and-pronouncable

반응형