2010-10-10 5 views
11

Bạn sẽ tìm thấy các từ chính xác trong một chuỗi ký tự dài như thế nào?Tìm các từ trong một chuỗi ký tự dài. Tự động mã hóa

Input:

"The revised report onthesyntactictheoriesofsequentialcontrolandstate" 

của Google Output:

"The revised report on syntactic theories sequential controlandstate" 

(mà là gần đủ cân nhắc thời gian mà họ sản xuất sản lượng)

Bạn nghĩ thế nào Google làm điều đó? Bạn sẽ tăng độ chính xác như thế nào?

+0

bản sao có thể có của [Justadistraction: tokenizing English without whitespaces. Murakami SheepMan] (http://stackoverflow.com/questions/3851723/justadistraction-tokenizing-english-without-whitespaces-murakami-sheepman) –

+0

Nếu không có một số kiến ​​thức ngữ nghĩa sẽ luôn luôn có thể trùng lặp. Hãy xem xét "theiron" = "sắt" = "của họ trên" –

Trả lời

10

tôi sẽ cố gắng một thuật toán đệ quy như thế này:

  • Thử chèn dấu cách vào mỗi vị trí. Nếu phần bên trái là một từ, sau đó lặp lại ở phần bên phải.
  • Đếm số từ/số từ hợp lệ trong tổng số các kết quả cuối cùng. Người có tỷ lệ tốt nhất có thể là câu trả lời của bạn.

Ví dụ, cho nó "thesentenceisgood" sẽ chạy:

thesentenceisgood 
the sentenceisgood 
    sent enceisgood 
     enceisgood: OUT1: the sent enceisgood, 2/3 
    sentence isgood 
      is good 
       go od: OUT2: the sentence is go od, 4/5 
      is good: OUT3: the sentence is good, 4/4 
    sentenceisgood: OUT4: the sentenceisgood, 1/2 
these ntenceisgood 
     ntenceisgood: OUT5: these ntenceisgood, 1/2 

Vì vậy, bạn sẽ chọn OUT3 là câu trả lời.

+1

+1 - Nhưng "câu là goo d" có thể cho 5/5, tùy thuộc vào từ điển. Điều này đặt ra câu hỏi làm thế nào để đánh giá hai phân tích cú pháp hoàn chỉnh, chẳng hạn như ví dụ "cây bút sáng sủa hơn là gươm". –

+0

Theo dictionary.com, [od] (http://dictionary.reference.com/browse/od?r=75&src=ref&ch=dic) là "một lực giả định trước đây được tổ chức để tràn ngập tất cả tự nhiên và biểu hiện chính nó trong từ tính , thôi miên, hành động hóa học, v.v. " vì vậy bạn có OUT2 hoặc OUT3 = P. – Claudiu

+0

@ Jeffrey: heh, chúng tôi nghĩ như nhau. vì vậy tất cả các OUT2, OUT3 và OUTJEFFREY đều có thể được chọn. bạn có thể muốn cân nhắc nó có lợi cho các từ dài hơn bằng cách nào đó, vì tôi nghĩ rằng những lỗi này sẽ có xu hướng xảy ra bằng cách tạo ra những từ ngắn hơn cần thiết. hoặc bạn có thể làm một số thứ NLP, xác định chúng như là một phần của bài phát biểu và xem chúng có nhiều khả năng nhất .. – Claudiu

0

Kiểm tra thuật toán sửa lỗi chính tả. Đây là liên kết đến một bài viết về thuật toán được sử dụng trong google - http://www.norvig.com/spell-correct.html. Ở đây bạn sẽ tìm thấy a scientific paper on this topic from google.

+1

Liên kết đẹp, nhưng chỉ có liên quan rất xa đến câu hỏi. Mở rộng thuật toán này để tìm tất cả các liên kết có thể có của 5 từ sẽ là một ** lớn ** lãng phí tài nguyên. –

+0

Trong NLP không có gì ** đến ** dễ dàng ... – Skarab

3

Đây là một mã trong Mathematica Tôi bắt đầu phát triển cho một sân golf mã gần đây.
Đó là thuật toán tối thiểu, không tham lam, đệ quy. Điều đó có nghĩa rằng câu "bút là mighter hơn thanh kiếm" (không có khoảng trắng) trả về { "bút là sức er hơn sword} :)

findAll[s_] := 
    Module[{a = s, b = "", c, sy = "="}, 
    While[ 
    StringLength[a] != 0, 
    j = ""; 
    While[(c = findFirst[a]) == {} && StringLength[a] != 0, 
    j = j <> StringTake[a, 1]; 
    sy = "~"; 
    a = StringDrop[a, 1]; 
    ]; 
    b = b <> " " <> j ; 
    If[c != {}, 
    b = b <> " " <> c[[1]]; 
    a = StringDrop[a, StringLength[c[[1]]]]; 
    ]; 
    ]; 
    Return[{StringTrim[StringReplace[b, " " -> " "]], sy}]; 
] 

findFirst[s_] := 
    If[s != "" && (c = DictionaryLookup[s]) == {}, 
    findFirst[StringDrop[s, -1]], Return[c]]; 

Sample Input

ss = {"twodreamstop", 
     "onebackstop", 
     "butterfingers", 
     "dependentrelationship", 
     "payperiodmatchcode", 
     "labordistributioncodedesc", 
     "benefitcalcrulecodedesc", 
     "psaddresstype", 
     "ageconrolnoticeperiod", 
     "month05", 
     "as_benefits", 
     "fname"} 

Output

twodreamstop    = two dreams top 
onebackstop    = one backstop 
butterfingers    = butterfingers 
dependentrelationship  = dependent relationship 
payperiodmatchcode  = pay period match code 
labordistributioncodedesc ~ labor distribution coded es c 
benefitcalcrulecodedesc ~ benefit c a lc rule coded es c 
psaddresstype    ~ p sad dress type 
ageconrolnoticeperiod  ~ age con rol notice period 
month05     ~ month 05 
as_benefits    ~ as _ benefits 
fname      ~ f name 

HTH

+0

Bạn có thể mô tả thuật toán không? – unj2

6

Thử thường xuyên ngữ pháp ngẫu nhiên (tương đương với mô hình Markov ẩn) với các quy tắc sau:

for every word in a dictionary: 
stream -> word_i stream with probability p_w 
word_i -> letter_i1 ...letter_in` with probability q_w (this is the spelling of word_i) 
stream -> letter stream with prob p (for any letter) 
stream -> epsilon with prob 1 

Xác suất có thể được bắt nguồn từ một tập huấn luyện, nhưng thấy các cuộc thảo luận sau. Phân tích cú pháp có khả năng nhất được tính bằng thuật toán Viterbi, có độ phức tạp bậc hai về số lượng trạng thái ẩn, trong trường hợp này là từ vựng của bạn, vì vậy bạn có thể gặp vấn đề về tốc độ với từ vựng lớn. Nhưng nếu bạn đặt tất cả p_w = 1, q_w = 1 p = .5 Có nghĩa là, đây là xác suất trong mô hình ngôn ngữ nhân tạo, trong đó tất cả các từ đều có khả năng giống nhau và tất cả các từ không đều có khả năng giống nhau. Tất nhiên bạn có thể phân đoạn tốt hơn nếu bạn không sử dụng đơn giản hóa này, nhưng độ phức tạp của thuật toán sẽ giảm đi một chút. Nếu bạn nhìn vào mối quan hệ lặp lại trong wikipedia entry bạn có thể thử và đơn giản hóa nó cho trường hợp đặc biệt này.Xác suất phân tích cú pháp viterbi lên đến vị trí k có thể được đơn giản hóa thành VP(k) = max_l(VP(k-l) * (1 if text[k-l:k] is a word else .5^l) Bạn có thể liên kết l với chiều dài tối đa của một từ và tìm xem một chữ cái có tạo thành một từ có tìm kiếm băm hay không. Sự phức tạp của điều này là độc lập với kích thước từ vựng và là O(<text length> <max l>). Xin lỗi đây không phải là một bằng chứng, chỉ là một bản phác thảo nhưng sẽ giúp bạn đi. Một tối ưu hóa tiềm năng khác, nếu bạn tạo một trie của từ điển, bạn có thể kiểm tra xem chuỗi con có phải là tiền tố của bất kỳ từ đúng nào không. Vì vậy, khi bạn truy vấn văn bản [k-l: k] và nhận được câu trả lời phủ định, bạn đã biết rằng điều này cũng đúng cho văn bản [k-l: k + d] cho bất kỳ d nào. Để tận dụng lợi thế này, bạn sẽ phải sắp xếp lại đệ quy một cách đáng kể, vì vậy tôi không chắc chắn điều này có thể được khai thác đầy đủ (nó có thể xem bình luận).

+0

Thực ra, tôi chỉ thuyết phục bản thân rằng bạn có thể sử dụng tối ưu hóa tiềm năng mà tôi đã mô tả. Hãy tưởng tượng một ma trận TxT trong đó T là độ dài của văn bản. Một mục (i, j) là 0 nếu văn bản [i, j] là một từ, khác là 1. Bây giờ nếu bạn điền vào (bạn chỉ cần một dải chéo lên đến chiều dài từ tối đa) với một vòng lặp lồng nhau cho i: cho j: sau đó ngay sau khi bạn nhận ra rằng văn bản [i: j] không phải là tiền tố của bất kỳ từ nào, bạn có thể điền phần còn lại bằng 1s. Điều này mang lại cho bạn một lợi thế nếu bạn sử dụng một biểu diễn thưa thớt, như một defaultdict mặc định là 1, do đó bạn thực sự chỉ cần viết các số 0. – piccolbo

+0

Hình thức đệ quy này là ví dụ đầu tiên về lập trình động và được tìm thấy trong một bài báo của Bellman từ thập niên 60 (ứng dụng là xử lý tín hiệu) – piccolbo

+0

Để làm cho nó chính xác hơn, bạn có thể sử dụng một văn bản để lấy xác suất, xem ví dụ http://www.cs.brown.edu/research/ai/dynamics/tutorial/Documents/HiddenMarkovModels.html, sự cố 3 và nhìn ngay cả ở hai từ hoặc nhiều hơn, giới thiệu các quy tắc như luồng -> word_i word_j stream. Bạn cũng có thể sử dụng dữ liệu ngram hiện có, chẳng hạn như dữ liệu khổng lồ do Google phát hành (không phải là sử dụng miễn phí và phi thương mại). Nhưng có một chi phí tính toán phải trả. – piccolbo

0

Sau khi thực hiện phân tích đệ quy và tra cứu từ điển, để tăng chất lượng của các cặp từ trong cụm từ của bạn, bạn có thể quan tâm đến việc sử dụng thông tin lẫn nhau của các cặp Word.

Điều này chủ yếu là mặc dù tập huấn luyện và tìm ra M.I. giá trị của các cặp từ cho bạn biết rằng Albert Simpson ít có khả năng hơn Albert Einstein :)

Bạn có thể thử tìm kiếm Science Direct cho các tài liệu học thuật trong chủ đề này. Để biết thông tin cơ bản về thông tin Mutual, hãy xem http://en.wikipedia.org/wiki/Mutual_information

Năm ngoái tôi đã tham gia vào phần tìm kiếm cụm từ của dự án công cụ tìm kiếm mà tôi đang cố gắng phân tích tập dữ liệu wikipedia và xếp hạng từng cặp từ. Tôi đã có mã trong C + + nếu bạn quan tâm có thể chia sẻ nó với bạn nếu bạn có thể tìm thấy một số sử dụng của nó. Nó phân tích cú pháp wikimedia và cho mỗi cặp từ tìm ra thông tin lẫn nhau.