Excel không có cấu trúc?

Chúng ta đang sống trong thời đại lấy dữ liệu làm trung tâm. Dữ liệu đã được mô tả như dầu mới. Nhưng cũng giống như dầu, dữ liệu không phải lúc nào cũng hữu ích ở dạng thô. Một dạng dữ liệu đặc biệt khó sử dụng ở dạng thô là dữ liệu phi cấu trúc

Rất nhiều dữ liệu là dữ liệu phi cấu trúc. Dữ liệu phi cấu trúc không vừa với định dạng để phân tích, chẳng hạn như bảng tính Excel hoặc khung dữ liệu. Dữ liệu văn bản là một loại dữ liệu phi cấu trúc phổ biến và điều này gây khó khăn khi làm việc với. Nhập cụm từ thông dụng hoặc viết tắt là regex. Lúc đầu, chúng có thể trông hơi đáng sợ, nhưng một khi bạn đã bắt đầu, việc sử dụng chúng sẽ là một chuyến dã ngoại

Thoải mái hơn với trăn?

Giới thiệu nhẹ nhàng về Biểu thức chính quy với Python

Biểu thức chính quy là vũ khí đáng gờm nhất của nhà khoa học dữ liệu chống lại văn bản phi cấu trúc

hướng tới khoa học dữ liệu. com

Thư viện
[[1]]
[1] "Drew"
8

Chúng tôi sẽ sử dụng thư viện

[[1]]
[1] "Drew"
8. Thư viện
[[1]]
[1] "Drew"
8 được xây dựng từ thư viện C, vì vậy tất cả các chức năng của nó rất nhanh

Để cài đặt và tải thư viện

[[1]]
[1] "Drew"
8 trong R, hãy sử dụng các lệnh sau

Xem cách dễ dàng như vậy? . Chúng ta hãy xem xét một số chức năng chúng tôi có sẵn cho chúng tôi trong mô-đun này

  1. "Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"
    4. Hàm này trả về một danh sách với một vectơ chứa tất cả các phiên bản của
    "Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"
    5 trong
    "Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"
    6
  2. "Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"
    7. Hàm này trả về
    "Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"
    6 với các trường hợp của
    "Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"
    5 trong
    "Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"
    6 được thay thế bằng
    [[1]]
    [1] "Drew"
    31

Bạn có thể đã sử dụng các chức năng này. Họ có các ứng dụng khá đơn giản mà không cần thêm regex. Nghĩ lại khoảng thời gian trước khi xã hội xa cách và tưởng tượng một buổi dã ngoại thú vị trong công viên, giống như hình ảnh trên. Đây là một chuỗi ví dụ với những gì mọi người sẽ mang đến buổi dã ngoại. Chúng ta có thể sử dụng nó để chứng minh cách sử dụng cơ bản của các hàm regex

[[1]]
[1] "Drew"
4

Nếu tôi muốn lấy mọi trường hợp tên của một người từ chuỗi này, tôi chỉ cần chuyển tên và

[[1]]
[1] "Drew"
32 đến
[[1]]
[1] "Drew"
33

Kết quả sẽ là một danh sách với tất cả các lần xuất hiện của mẫu. Sử dụng ví dụ này,

[[1]]
[1] "Drew"
34 sẽ có danh sách sau với đầu ra là 1 vectơ

[[1]]
[1] "Drew"

Bây giờ hãy tưởng tượng rằng Alex đã bỏ quên 4 chiếc bánh mì kẹp thịt của mình trong buổi dã ngoại và chúng đã bị Shawn đánh cắp.

[[1]]
[1] "Drew"
35 có thể thay thế bất kỳ trường hợp nào của Alex bằng Shawn

Chuỗi kết quả sẽ hiển thị rằng Shawn hiện có 4 bánh mì kẹp thịt. Thật là một chàng trai may mắn 🍔

"Drew has 3 watermelons, Shawn has 4 hamburgers, Karina has 12 tamales, and Anna has 6 soft pretzels"

Các ví dụ cho đến nay là khá cơ bản. Có thời gian và địa điểm cho chúng, nhưng nếu chúng ta muốn biết tổng số thức ăn có trong buổi dã ngoại thì sao?

Từ vựng Regex

Có một số khái niệm thúc đẩy regex

  1. Bộ nhân vật
  2. Ký tự meta
  3. định lượng
  4. chụp nhóm

Đây không phải là một danh sách đầy đủ, nhưng có rất nhiều thứ để giúp chúng ta thành công

Bộ nhân vật

Bộ ký tự đại diện cho các tùy chọn bên trong dấu ngoặc, với biểu thức chính quy chỉ khớp với một trong các tùy chọn. Có nhiều thứ chúng ta có thể làm với bộ ký tự

  • Ghép một nhóm ký tự. Chúng ta có thể tìm thấy tất cả các nguyên âm trong chuỗi của mình bằng cách đặt mọi nguyên âm trong ngoặc, ví dụ,
    [[1]]
    [1] "Drew"
    36

[[1]]
[1] "Drew"
3
  • Khớp một loạt các ký tự. Chúng ta có thể tìm thấy bất kỳ chữ in hoa nào từ “A” đến “F” bằng cách sử dụng dấu gạch nối,
    [[1]]
    [1] "Drew"
    37. Bộ ký tự phân biệt chữ hoa chữ thường, vì vậy
    [[1]]
    [1] "Drew"
    37 không giống với
    [[1]]
    [1] "Drew"
    39

[[1]]
[1] "Drew"
6
  • Khớp một dãy số. Chúng tôi có thể tìm các số giữa một phạm vi bằng cách thêm các số vào bộ ký tự của chúng tôi,
    [[1]]
    [1] "Drew"
    60 để tìm bất kỳ số nào. Lưu ý rằng các số được trích xuất dưới dạng chuỗi, không được chuyển đổi thành số

[[1]]
[1] "Drew"
8

Các bộ ký tự có thể chứa mọi thứ từ phần này đồng thời, vì vậy những thứ như

[[1]]
[1] "Drew"
61 vẫn hợp lệ. Nó sẽ khớp với mọi ký tự từ chữ “A” viết hoa đến chữ “C”, chữ thường “t” đến chữ thường “z” và từ 7 đến 9

Cho đến nay, chúng tôi không thể trả lời bất kỳ câu hỏi nào được đặt ra trước đó chỉ với các nhóm dấu ngoặc. Hãy thêm một số vũ khí vào kho vũ khí regex của chúng ta

Siêu nhân vật

Ký tự meta đại diện cho một loại ký tự. Chúng thường sẽ bắt đầu bằng dấu gạch chéo ngược

[[1]]
[1] "Drew"
62. Vì dấu gạch chéo ngược
[[1]]
[1] "Drew"
62 là một ký tự đặc biệt trong R, nên nó cần được thoát mỗi khi nó được sử dụng với dấu gạch chéo ngược khác. Nói cách khác, R yêu cầu 2 dấu gạch chéo ngược khi sử dụng ký tự meta. Mỗi ký tự meta sẽ khớp với một ký tự duy nhất. Dưới đây là một số trong những điều quan trọng nhất trong hành động

  • [[1]]
    [1] "Drew"
    64. Ký tự meta này đại diện cho khoảng trắng. Điều này sẽ khớp với từng dấu cách, tab và ký tự dòng mới. Bạn cũng có thể chỉ định
    [[1]]
    [1] "Drew"
    65 và
    [[1]]
    [1] "Drew"
    66 cho các ký tự tab và dòng mới tương ứng. lưu ý bên lề. chuỗi ví dụ của chúng tôi không có bất kỳ tab nào, nhưng hãy thận trọng khi tìm kiếm chúng. Nhiều môi trường phát triển tích hợp hoặc IDE có cài đặt sẽ thay thế tất cả các tab bằng dấu cách trong khi bạn đang nhập. Trong chuỗi ví dụ,
    [[1]]
    [1] "Drew"
    64 trả về danh sách một vectơ gồm 17 khoảng trắng, số lượng khoảng trắng chính xác trong chuỗi ví dụ của chúng tôi

[[1]]
[1] "Drew"
6
  • [[1]]
    [1] "Drew"
    68. Ký tự meta này đại diện cho các ký tự chữ và số. Điều này bao gồm tất cả các chữ cái a-z, chữ hoa và chữ thường và các số 0–9. Điều này sẽ tương đương với nhóm dấu ngoặc
    [[1]]
    [1] "Drew"
    69, chỉ là viết nhanh hơn nhiều. Hãy thận trọng khi nhớ rằng bản thân ký tự meta
    [[1]]
    [1] "Drew"
    68 chỉ chụp một ký tự duy nhất, không phải toàn bộ từ hoặc số. Bạn sẽ thấy điều đó trong ví dụ. Đừng lo lắng, chúng tôi sẽ giải quyết vấn đề đó trong phần tiếp theo

[[1]]
[1] "Drew"
0
  • [[1]]
    [1] "Drew"
    81. Ký tự meta này đại diện cho các chữ số. Sử dụng ví dụ dã ngoại của chúng tôi, hãy xem cách nó chỉ tìm thấy các chữ số trong chuỗi. Bạn sẽ nhận thấy rằng giống như các nhóm dấu ngoặc, nó chọn 5 số thay vì 4 như chúng tôi mong đợi. Điều này là do nó đang tìm kiếm từng chữ số riêng lẻ, không phải nhóm chữ số. Tiếp theo chúng ta sẽ xem cách khắc phục điều đó bằng các bộ định lượng

[[1]]
[1] "Drew"
8

định lượng

Như chúng ta đã thấy trong phần trước, một ký tự meta đơn lẻ có thể có chức năng hơi hạn chế. Khi nói đến từ hoặc số, chúng ta thường muốn tìm nhiều hơn 1 ký tự cùng một lúc. Đây là nơi định lượng đi vào. Chúng cho phép bạn định lượng có bao nhiêu ký tự mà bạn đang mong đợi. Chúng luôn theo đuổi đặc điểm mà chúng đang định lượng và có một vài hương vị

  • [[1]]
    [1] "Drew"
    82 định lượng 1 hoặc nhiều trận đấu. Hãy xem xét một ví dụ mới để phát triển một số trực giác về những gì mỗi bộ định lượng sẽ trả về.
    [[1]]
    [1] "Drew"
    83

Khi chúng tôi sử dụng bộ định lượng

[[1]]
[1] "Drew"
82 trên
[[1]]
[1] "Drew"
83, nó sẽ trả về 4 kết quả phù hợp. Đây là một điểm tốt để đề cập rằng regex tìm kiếm các kết quả không trùng lặp. Trong trường hợp này, nó xem xét từng chữ B và ký tự theo sau nó. Vì chúng tôi đã sử dụng bộ định lượng
[[1]]
[1] "Drew"
82, nên nó tiếp tục khớp cho đến khi kết thúc một nhóm B

[[1]]
[1] "Drew"
8
  • [[1]]
    [1] "Drew"
    87 định lượng một số hoặc phạm vi khớp cụ thể. Khi được viết như
    [[1]]
    [1] "Drew"
    88, nó sẽ khớp chính xác với 2 ký tự trước đó. Chúng ta sẽ thấy một số kết quả thú vị. Nó nhặt được 4 trận. Điều này là do nó đang tìm kiếm từng nhóm 2 B không trùng nhau. Có 1 trận ở nhóm 1, chỉ 1 trận không trùng nhau ở nhóm 2 và 2 trận không trùng nhau ở nhóm 4

[[1]]
[1] "Drew"
0

Khi được viết như

[[1]]
[1] "Drew"
89, nó sẽ khớp với bất kỳ số lượng B nào từ 2 đến 4 lần xuất hiện. Lưu ý rằng việc đặt khoảng trắng trong biểu thức chính quy của bạn sẽ KHÔNG hoạt động. Nó sẽ trả về một danh sách trống

[[1]]
[1] "Drew"
1

Chúng ta cũng có thể viết bộ định lượng này và bỏ qua giới hạn trên như

[[1]]
[1] "Drew"
60. Điều này sẽ phù hợp với 2 hoặc nhiều trường hợp. Đối với
[[1]]
[1] "Drew"
83, nó sẽ trả về kết quả chính xác giống như
[[1]]
[1] "Drew"
89

  • [[1]]
    [1] "Drew"
    63 định lượng không hoặc nhiều kết quả phù hợp. Điều này có thể hữu ích khi chúng tôi đang tìm kiếm thứ gì đó có thể có hoặc không có trong chuỗi của chúng tôi

Bộ định lượng

[[1]]
[1] "Drew"
63 trả về một số kết quả khớp lạ khi được sử dụng bởi chính nó, vì vậy chúng ta có thể bỏ qua một ví dụ với
[[1]]
[1] "Drew"
83. Chúng ta sẽ xem trong một ví dụ sau cách nó có thể được áp dụng khi ai đó trong buổi dã ngoại của chúng ta mang theo một món ăn có tên nhiều từ. Nếu không có nó, chúng tôi sẽ không nắm bắt được chính xác rằng Anna đang mang bánh quy mềm

Hãy kết hợp những gì chúng ta biết cho đến nay về bộ ký tự, ký tự meta và bộ định lượng để trả lời một số câu hỏi về chuỗi dã ngoại của chúng ta. Chúng tôi muốn biết tất cả các từ có trong chuỗi và cả các số trong chuỗi

Đối với các từ, chúng ta có thể sử dụng một bộ ký tự có tất cả chữ hoa và chữ thường, thêm một bộ định lượng

[[1]]
[1] "Drew"
82 vào nó. Điều này sẽ tìm thấy bất kỳ độ dài ký tự alpha nào được nhóm lại với nhau. Nói cách khác, nó tìm thấy tất cả các từ. Regex đang bắt đầu có vẻ hữu ích hơn nhiều

[[1]]
[1] "Drew"
2

Để tìm số lượng của từng mặt hàng thực phẩm, chúng ta có thể sử dụng ký tự meta

[[1]]
[1] "Drew"
81 và bộ định lượng
[[1]]
[1] "Drew"
68. Điều này sẽ tìm thấy các nhóm chữ số dài 1 hoặc 2 ký tự. Đây là một đầu ra hữu ích hơn nhiều vì chúng ta có cùng số lượng như chúng ta có các mặt hàng thực phẩm và con người

[[1]]
[1] "Drew"
3

Để tìm số lượng và tên của từng mặt hàng thực phẩm, chúng ta có thể kết hợp các bộ định lượng với các ký tự meta. Chúng tôi biết rằng mỗi số có một mặt hàng thực phẩm ngay sau nó, vì vậy chúng tôi chỉ cần thêm vào ví dụ trước. Chúng tôi biết rằng có một khoảng trống và một từ (

[[1]]
[1] "Drew"
69) có thể được theo sau bởi một từ khác như cách xuất hiện của “bánh quy xoắn mềm”. Để xác định từ thứ hai có thể không có ở đó, chúng ta có thể sử dụng bộ định lượng
[[1]]
[1] "Drew"
63 với từ thứ hai. Cứ như vậy, chúng tôi có một danh sách chứa số lượng và tên của mọi hàng hóa trong chuyến dã ngoại của chúng tôi

[[1]]
[1] "Drew"
4

chụp nhóm

Các nhóm chụp cho phép bạn tìm kiếm toàn bộ cụm từ và chỉ trả về một phần của chúng. Với ví dụ của chúng ta, tôi muốn biết tên của từng người, họ mang theo những gì và họ mang theo bao nhiêu. Cho đến thời điểm này, chúng tôi đã sử dụng

[[1]]
[1] "Drew"
01. Nó có đầu ra rõ ràng, dễ đọc đối với các ví dụ của chúng tôi, nhưng nó không thực sự hoạt động với các nhóm chụp. Thật hữu ích,
[[1]]
[1] "Drew"
8 cung cấp
[[1]]
[1] "Drew"
03 hoạt động với các nhóm chụp. Tuy nhiên, nó xuất kết quả trong danh sách chứa ma trận trái ngược với danh sách chứa vectơ

[[1]]
[1] "Drew"
5

Biểu thức chính quy mà chúng tôi đã sử dụng trong

[[1]]
[1] "Drew"
04 đang tìm kiếm một tên bắt đầu bằng chữ in hoa và có bất kỳ số lượng chữ thường nào sau nó (
[[1]]
[1] "Drew"
05). Sau đó, sau một khoảng trắng, nó khớp với không gian mẫu, từ, khoảng trắng
[[1]]
[1] "Drew"
06. Tiếp theo, chúng tôi đang tìm kiếm một số có 1 đến 2 chữ số, theo sau là khoảng trắng và một từ (
[[1]]
[1] "Drew"
07). Bạn có thể thấy ở đầu ra mỗi hàng của ma trận là một chuỗi ký tự với thông tin chi tiết của từng người

Bây giờ, đây là một bước tiến lớn so với nơi chúng tôi bắt đầu, nhưng chúng tôi không thực sự quan tâm đến từ "có" và chúng tôi muốn có thể tạo khung dữ liệu từ số lượng. Hãy thêm vào các nhóm chụp. Bằng cách sử dụng các nhóm chụp, chúng tôi có thể trả về một ma trận trong đó mỗi cột chứa một phần thông tin cụ thể. Chúng tôi sẽ tạo các nhóm chụp có chứa từng tên, số lượng và mặt hàng. Các nhóm chụp chỉ đơn giản là các phần của biểu thức chính quy mà bạn đặt trong dấu ngoặc đơn

[[1]]
[1] "Drew"
6

Cột đầu tiên trong ma trận có toàn bộ biểu thức chính quy, bỏ qua các nhóm chụp. Mỗi cột còn lại của ma trận tương ứng với các nhóm chụp mà chúng tôi đã xác định cho tên, số lượng và mặt hàng

Kết hợp Văn bản của chúng tôi vào Khung dữ liệu

Khi thực hiện phân tích dữ liệu, một trong những cấu trúc dữ liệu R hữu ích nhất là khung dữ liệu. Chắc chắn bạn đã biết điều này nếu bạn nhấp vào bài viết này. Khung dữ liệu cho phép những thứ như tính toán thống kê cột và vẽ dữ liệu. Vì chúng tôi có một ma trận với tất cả thông tin chúng tôi muốn, nên việc biến nó thành một khung dữ liệu không quá khó. Chúng tôi sẽ sử dụng hàm

[[1]]
[1] "Drew"
08 trên mọi thứ ngoại trừ cột đầu tiên của ma trận.
[[1]]
[1] "Drew"
08 cung cấp các tên cột mặc định, vì vậy chúng tôi sẽ thay đổi các tên đó để khớp với nội dung trong mỗi cột

Ghi chú nhanh về ký hiệu. bộ dấu ngoặc đầu tiên sau khi

[[1]]
[1] "Drew"
80 (
[[1]]
[1] "Drew"
81) truy cập phần tử đầu tiên của danh sách, ma trận của chúng tôi. Bộ dấu ngoặc thứ hai (
[[1]]
[1] "Drew"
82) chọn tất cả các hàng và mọi cột ngoại trừ cột đầu tiên

[[1]]
[1] "Drew"
7

Kết luận và học thêm

Chúng tôi chỉ đề cập đến một tập hợp con nhỏ về cách regex có thể giúp xử lý dữ liệu văn bản phi cấu trúc. Đây là nền tảng tốt để bắt đầu, nhưng trước đó bạn sẽ cần biết các khái niệm như cách tìm mọi thứ NHƯNG một ký tự (phủ định) hoặc tìm thứ gì đó ngay trước hoặc sau thứ khác (nhìn quanh). Bạn có thể tìm hiểu tất cả về những điều đó trong bài đăng tiếp theo của tôi tại đây