관리 메뉴

Joonas' Note

Content-based File Format Detection (파일 확장자 예측) 본문

AI/머신러닝

Content-based File Format Detection (파일 확장자 예측)

joonas 2022. 5. 18. 23:29

    Dataset

    https://www.kaggle.com/datasets/joonasyoon/file-format-detection

     

    Programming Laungages and File Format Detection

    can you know what file format is? and written in which language?

    www.kaggle.com

    Code

    https://www.kaggle.com/code/joonasyoon/ml-content-based-file-format-detection

     

    [ML] 💾 Content-based File Format Detection 📃

    Explore and run machine learning code with Kaggle Notebooks | Using data from Programming Laungages and File Format Detection

    www.kaggle.com


    Context

    데이터셋을 만드는 것부터, ML 모델까지 전부 만들어서 확인해봤다.

    처음부터 ML 모델까지 작성할 생각은 아니었고, 파일의 확장자는 단순히 이름의 일부일 뿐이니까,
    확장자가 없는 상태에서 파일 내용만 보고 어떤 언어로 작성되었는 지 예측할 수 있을까? 하는 의문에서 출발했다.

    D/C/Go 언어 예시

    GitHub에는 수많은 코드들이 수많은 프로그래밍 언어들로, 그리고 수많은 코드 스타일로 작성되어 있고 공개되어 있다. 그래서 그것을 수집해서 데이터 셋을 만들었다.

    30개가 넘는 레포지토리에서 8만개가 넘는 텍스트 파일을 모았다. 랜덤으로 모으다보니 Dart, Rust, C#, Go를 가장 많이 모았다. 나머지 언어들도 파일 사이즈를 생각하면 적은 양은 아니라서 학습이 어려워보이지는 않았다.

    그래도 파일이 500개는 넘는 언어들만 학습해서 에측해보기로 했고, 언어들은 아래와 같다.

    • C
    • C#
    • C++
    • Dart
    • Diff
    • Elixir
    • GAS
    • GLSL
    • Go
    • JSON
    • Java
    • Javascript
    • Julia
    • Kotlin
    • Markdown
    • PHP
    • Ruby
    • Rust
    • SQL
    • Text
    • YAML

    JSON, Text, YAML 도 있으니 어떤 특정 언어라기보다는 데이터 포맷이라고 부르는 것이 맞아보인다.

    한 가지 걱정되는 것은 정말 완전한 랜덤인 Text를 잘 걸러낼 수 있을 지 모르겠다는 것이다.

    높은 정확도를 바라지 않고 단순하게 CountVectorizer로 벡터화해서 전부 학습시켰는데, 의외로 잘 나온다. 아주 조금만 학습해도 80%는 쉽게 넘어간다.

    8만개 파일(약 1GB)을 전부 읽으면 벡터 크기가 400만 정도는 된다.

    Conclusion

    LinearSVC:
      elapsed time: 0:06:04.338887
      accuracy: 94.61%
      roc_auc: 0.9877388985308935
    LogisticRegression:
      elapsed time: 1:06:56.671633
      accuracy: 97.02%
      roc_auc: 0.9882273614011244
    RidgeClassifier:
      elapsed time: 0:04:10.478925
      accuracy: 55.39%
      roc_auc: None
    random_forest:
      elapsed time: 0:05:06.379483
      accuracy: 93.68%
      roc_auc: 0.9825555088479243
    k_neighbors:
      elapsed time: 0:00:33.741252
      accuracy: 87.67%
      roc_auc: 0.9706357200070198
    SGD:
      elapsed time: 0:01:24.359626
      accuracy: 88.76%
      roc_auc: None

    전반적으로 스코어가 무척 높은 편이다. 실제로 몇 개를 뽑아서 모델에 코드를 넣고 예측 클래스를 확인해보면 잘 나온다.

    CountVectorizer에서 특수기호나 공백, stop words들이 제거될텐데 남은 단어들만으로도 언어를 구분할만큼의 유의미한 정보가 있는 모양이다. 예상컨대, 각 언어마다 쓰이는 예약어들로 구분할 수 있는 것 같다.

    글 상단에 첨부된 캐글 노트북에서 전체 결과를 확인할 수 있다.

    이걸 어디다 써먹을 수 있나 하겠지만, VSCode에서 사용하기도 하고, Slack의 snippet에서도 쓰이는 것으로 보인다.

    반응형
    0 Comments
    댓글쓰기 폼