2012-03-18 28 views
5

Tôi muốn tạo thuật toán để phân biệt những người viết trên diễn đàn dưới các biệt hiệu khác nhau.Khám phá người dùng phía sau nhiều tài khoản người dùng khác nhau theo các từ anh ấy sử dụng

Mục đích là để khám phá những người đăng ký tài khoản mới với diễn đàn ngọn lửa ẩn danh, không theo tài khoản chính của họ.

Khái niệm cơ bản Tôi đã suy nghĩ về các từ gốc mà họ sử dụng và so sánh người dùng theo sự tương đồng hoặc những từ này.

Users using words

Như đã trình bày trên hình ảnh có User3 và user4 người sử dụng cùng một từ. Nó có nghĩa là có lẽ một người đứng sau máy tính.

Rõ ràng là có rất nhiều từ phổ biến đang được tất cả người dùng sử dụng. Vì vậy, tôi nên tập trung vào các từ "người dùng cụ thể".

Input được (liên quan đến hình ảnh trên):

<word1, user1> 
<word2, user1> 
<word2, user2> 
<word3, user2> 
<word4, user2> 
<word5, user3> 
<word5, user4> 
... etc. The order doesnt matter 

Output nên là:

user1 
user2 
user3 = user4 

tôi đang làm điều này trong Java nhưng tôi muốn câu hỏi này là ngôn ngữ độc lập.

Bất kỳ ý tưởng nào về cách thực hiện?

1) cách lưu trữ từ/người dùng? Cấu trúc dữ liệu gì?

2) cách loại bỏ các từ thông dụng mà mọi người sử dụng? Tôi phải bằng cách nào đó bỏ qua chúng trong số các từ cụ thể của người dùng. Có lẽ tôi chỉ có thể bỏ qua chúng bởi vì họ bị lạc. Tôi sợ rằng họ sẽ ẩn sự khác biệt đáng kể của "các từ dành riêng cho người dùng"

3) cách nhận ra cùng một người dùng? - bằng cách nào đó đếm cùng một từ giữa mỗi người dùng?

Tôi rất biết ơn mọi lời khuyên trước.

Trả lời

1

Tôi đề xuất phương pháp tạo mô hình ngôn ngữ. Bạn có thể đào tạo một language model (unigram, bigram, parsimonious, ...) trên mỗi từ trong tài khoản người dùng của bạn. Điều đó cho phép bạn ánh xạ từ các từ đến xác suất, tức là các số từ 0 đến 1 (bao gồm) thể hiện khả năng người dùng sử dụng từng từ bạn gặp phải trong tập huấn luyện hoàn chỉnh. Mô hình ngôn ngữ có thể được lưu trữ dưới dạng mảng của các cặp, bảng băm hoặc . Có rất nhiều thư viện trên web cho các LM phù hợp.

Ánh xạ như vậy có thể được coi là một vector chiều cao, trong cùng một cách tài liệu được coi là vectơ trong việc truy xuất thông tin vector space model. Sau đó, bạn có thể so sánh các vectơ này bằng cách sử dụng KL-divergence hoặc bất kỳ chỉ số khoảng cách phổ biến nào: Euclidean distance, cosine distance, v.v. Một điểm tương đồng/khoảng cách nhỏ giữa vectơ của hai người dùng có thể cho biết chúng thuộc về một và cùng một người dùng.

0

cách lưu trữ từ/người dùng? Cấu trúc dữ liệu gì?

Bạn có thể có một số loại biểu diễn cho người dùng và các bài đăng mà họ đã tạo.Tôi nghĩ bạn nên có một danh sách các từ, và một danh sách tương ứng với mỗi từ chứa những người dùng sử dụng nó. Một cái gì đó như:

<word: <user#1, user#4, user#5, ...> > 

cách loại bỏ những từ thông dụng mà mọi người sử dụng?

Hy vọng rằng, bạn có một bộ stopwords. Tại sao không mở rộng nó để bao gồm các từ thường được sử dụng từ diễn đàn của bạn? Ví dụ, đối với stackoverflow, một số tên thẻ thường được sử dụng nhất nên đủ điều kiện cho nó.

cách nhận ra cùng người dùng?

Ngoài việc sử dụng các biện pháp tương tự hoặc từ tần số, bạn cũng có thể thử sử dụng tương tác giữa người dùng. Ví dụ: user3 lượt thích/upvotes/nhận xét mỗi bài đăng của user8 hoặc người dùng mới thực hiện những việc tương tự cho một số người dùng (cũ) khác theo cách này.

2

Nói chung đây là nhiệm vụ nhận dạng tác giả và có một số giấy tờ hay như this có thể cung cấp cho bạn nhiều thông tin. Dưới đây là những gợi ý của tôi về chủ đề này.

1. nhận tài khoản/tác giả xác định bản thân

Các loại đơn giản nhất của phân loại văn bản là phân loại theo chủ đề, và có bạn đi từ ý nghĩa đầu tiên của tất cả. Đó là, nếu bạn muốn phân biệt văn bản về Apple và táo, bạn đếm những từ như "ăn", "cam", "iPhone", v.v., nhưng bạn thường bỏ qua những thứ như bài viết, dạng từ, phần thông tin về lời nói (POS) và vân vân. Tuy nhiên nhiều người có thể nói về cùng chủ đề, nhưng sử dụng các kiểu khác nhau của bài phát biểu, đó là bài viết, dạng từ và tất cả những điều bạn bỏ qua khi phân loại theo chủ đề. Vì vậy, điều đầu tiên và chính bạn nên xem xét là thu thập các tính năng hữu ích nhất hữu ích nhất cho thuật toán của bạn. Phong cách của tác giả có thể được biểu thị bằng tần số các từ như "a" và "the", thông tin POS (ví dụ: một số người có xu hướng sử dụng thời gian hiện tại, những người khác - tương lai), cụm từ phổ biến ("Tôi muốn" so với "Tôi muốn như "vs." tôi muốn ") và cứ tiếp tục như vậy. Lưu ý rằng không nên bỏ hoàn toàn các từ chủ đề - chúng vẫn hiển thị chủ đề mà người dùng quan tâm. Tuy nhiên, bạn nên xử lý chúng một cách cụ thể, ví dụ: bạn có thể phân loại trước các văn bản theo chủ đề và sau đó phân biệt đối xử người dùng không quan tâm đến nó.

Khi bạn hoàn tất việc thu thập tính năng, bạn có thể sử dụng một trong các thuật toán học máy để tìm đoán tốt nhất cho tác giả của văn bản. Đối với tôi, 2 gợi ý tốt nhất ở đây là xác suất và cosine similarity giữa vector văn bản và vector phổ biến của người dùng.

2. Phân biệt các từ thông dụng

Hoặc, trong bối cảnh mới nhất, tính năng thông thường. Cách tốt nhất tôi có thể nghĩ ra để thoát khỏi những từ mà đang được sử dụng bởi tất cả mọi người ít nhiều đều là để tính toán entropy cho mỗi tính năng như:

entropy(x) = -sum(P(Ui|x) * log(P(Ui|x))) 

nơi x là một tính năng, U - người sử dụng , P(Ui|x) - xác suất có điều kiện của người dùng thứ i được cung cấp tính năng x và sum là tổng số tất cả người dùng.

Giá trị cao của entropy cho thấy rằng phân phối cho tính năng này gần như đồng nhất và do đó gần như vô dụng.

3. đại diện dữ liệu

cách tiếp cận phổ biến ở đây là để có sử dụng tính năng ma trận. Tức là, bạn chỉ cần xây dựng bảng trong đó các hàng là các id người dùng và các cột là các tính năng. Ví dụ. cell [3][12] hiển thị chuẩn hóa số lần người dùng # 3 sử dụng tính năng # 12 (đừng quên chuẩn hóa các tần số này theo tổng số tính năng mà người dùng đã sử dụng!).

Tùy thuộc vào các tính năng bạn sẽ sử dụng và kích thước của ma trận, bạn có thể muốn sử dụng triển khai ma trận thưa thớt thay vì dày đặc. Ví dụ. nếu bạn sử dụng 1000 tính năng và cho mỗi người dùng cụ thể khoảng 90% ô là 0, sẽ không có ý nghĩa gì nếu giữ tất cả các số 0 này trong bộ nhớ và triển khai thưa thớt là tùy chọn tốt hơn.

Các vấn đề liên quan